sql >> Database >  >> RDS >> Sqlserver

Hoe u SQL Server-taken migreert van de ene SQL Server-instantie naar de andere?

Inleiding

In een vorig artikel hebben we benadrukt dat de msdb-database praktisch alle objecten opslaat die te maken hebben met automatisering. In dit artikel bespreken we het verplaatsen van taken en objecten tussen de SQL Server-instanties.

Laten we beginnen met de lijst met objecten die zijn opgeslagen in msdb op dit exemplaar van SQL Server.

We hebben verschillende jobs aangemaakt met een onderhoudsplan (zie het artikel Onderhoudsplannen maken in SQL Server). We hebben ook twee waarschuwingen en één operator. Msdb slaat ook waarschuwingen en operators op (zie afbeelding 1). We zullen deze objecten verwijderen en ze vervolgens herstellen door een back-up van de msdb-database te herstellen.

Objecten bekijken die zijn opgeslagen in msdb

Als we relevante systeemobjecten opvragen, zien we deze objecten ook als resultaatset geretourneerd. (Zie lijst 1, figuur 2). Msdb slaat ook de systeemcatalogi op met records van taken, back-uplogboeken, operators, onderhoudsplaatsen, databasemail en andere items met betrekking tot automatisering.

-- Listing 1: Check List of Jobs in the Instance
use msdb
go
select @@SERVERNAME as ServerName
select name from sysjobs;

Back-up msdb

Om het concept voor een enkel exemplaar van SQL Server te illustreren, maken we eerst een back-up van de msdb-database. In productiescenario's moeten regelmatige back-ups van uw systeemdatabases deel uitmaken van uw strategie. Ze zijn meestal klein genoeg om gemakkelijk in een dagelijks volledig back-upschema te passen.

Natuurlijk, als ik naar een systeemdatabase verwijs, is tempdb niet nodig. Bovendien is een dagelijkse back-up voor een modeldatabase misschien ook niet nodig, een wekelijkse back-up is voldoende. Overweeg master en msdb voor de volledige dagelijkse back-ups.

Met behulp van de eenvoudige code in Listing 2 maken we een back-up van de msdb-database.

-- Listing 2: Backup msdb Database 
backup database msdb to disk = 'E:\DriveF\msdb_18072020.bak';

Vacatures laten vallen

Zodra de back-up klaar is, laten we de taken op de instantie vallen. Houd er rekening mee dat het verwijderen van de taken die door een onderhoudsplan zijn gemaakt, vereist dat de onderhoudsplannen worden verwijderd waarmee ze zijn gemaakt (zie afbeelding 3).

Gewone taken kunnen worden verwijderd door ze te verwijderen met de GUI. Een andere manier is het uitvoeren van de code uit Listing 3, gevolgd door de code uit Listing 4.

Listing 3 genereert de set scripts die nodig is om de taken te laten vallen. Vervolgens voeren we in Listing 4 scripts uit die in Listing 3 zijn gegenereerd.

Je kunt deze aanpak gebruiken, ook al zijn de namen van banen in jouw geval waarschijnlijk anders dan de mijne.

-- Listing 3: Generate Script to Drop Jobs
USE [msdb]
GO
select 'EXEC msdb.dbo.sp_delete_job @job_name=N''' + [name] + ''', @delete_unused_schedule=1' from sysjobs;
GO
-- Listing 4: Drop SQL Agent Jobs
EXEC msdb.dbo.sp_delete_job @job_name=N'DB1_BackupTransactionLog', @delete_unused_schedule=1
EXEC msdb.dbo.sp_delete_job @job_name=N'syspolicy_purge_history', @delete_unused_schedule=1

Nadat we de banen hebben laten vallen, kunnen we controleren of er geen banen meer zijn. Gebruik hetzelfde script, zoals getoond in Listing 1. We overwegen twee manieren voor het scenario:

  1. Iemand heeft per ongeluk taken en soortgelijke objecten in een instantie verwijderd.
  2. We willen taken van de ene instantie naar de andere importeren.

MSDB herstellen

We starten de herstelbewerking met behulp van het script uit Listing 5. In dat script beginnen we met het instellen van de database op single_user-modus. Aangezien iemand of iets (SQL Agent-account?) in deze database kan zijn ingelogd, is dit noodzakelijk.

Vervolgens geven we de opdracht "restore" en stellen de nieuwe msdb-database in op multi_user. Merk op dat we de REPLACE-optie in de restore-instructie hebben gebruikt. Als u msdb naar een nieuwe instantie migreert, is de REPLACE-clausule nodig. Zonder dit kan SQL Server een fout retourneren over de back-upset die niet tot de msdb-database op de instantie behoort.

-- Listing 5: Restore msdb database
use master
go
alter database msdb set single_user with rollback immediate;
GO
restore database msdb from disk = 'E:\DriveG\msdb_18072020.bak'
with replace;
GO
alter database msdb set multi_user;
GO

Zodra de herstelbewerking is voltooid, zijn de ontbrekende taken en andere objecten terug. Ze worden compleet geleverd met hun respectieve werkgeschiedenis. Alle relaties tussen de jobs met databases en andere objecten zijn intact. De banen werken alsof niemand en niets ze ooit heeft verwijderd.

Conclusie

We kunnen taken en vergelijkbare objecten eenvoudig migreren van de ene SQL Server-instantie naar de andere. Daarvoor hebben we een back-up- en herstelproces van msdb nodig. Op dezelfde manier kunnen we deze objecten herstellen op een SQL Server-instantie als ze om de een of andere reden verloren zijn gegaan.


  1. Genereer DDL programmatisch op Postgresql

  2. Hoe u id's op Bijlagen kunt retourneren met Ibatis (met RETURNING-sleutelwoord)

  3. Kan de PostgreSQL-clientbibliotheek (libpq) niet vinden

  4. Android ListView:hoe databasequery's in bindView() vermijden? Moet een tot veel relatiegegevens ophalen