sql >> Databasteknik >  >> RDS >> Sqlserver

Hur man migrerar SQL Server-jobb från en SQL Server-instans till en annan

Introduktion

I en tidigare artikel lyfte vi fram att msdb-databasen lagrar praktiskt taget alla objekt relaterade till automatisering. I den här artikeln kommer vi att granska fallet med att flytta jobb och objekt mellan SQL Server-instanserna.

Låt oss börja med listan över objekt lagrade i msdb på den här instansen av SQL Server.

Vi har flera jobb skapade med en underhållsplan (se artikeln Skapa underhållsplaner i SQL Server). Vi har även två larm och en operatör. Msdb lagrar även varningar och operatörer (se figur 1). Vi ska ta bort dessa objekt och sedan återställa dem genom att återställa en säkerhetskopia av msdb-databasen.

Visa objekt lagrade i msdb

Om vi ​​frågar efter relevanta systemobjekt ser vi även dessa objekt returnerade som resultatuppsättningen. (Se lista 1, figur 2). Msdb lagrar också systemkatalogerna med register över jobb, backuploggar, operatörer, underhållsplatser, databaspost och andra artiklar relaterade till automatisering.

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

Säkerhetskopiera msdb

För att illustrera konceptet för en enskild instans av SQL Server tar vi en säkerhetskopia av msdb-databasen först. I produktionsscenarier bör regelbundna säkerhetskopieringar av dina systemdatabaser vara en del av din strategi. De är vanligtvis tillräckligt små för att bekvämt passa in i ett dagligt fullständigt säkerhetskopieringsschema.

Naturligtvis, när jag hänvisar till en systemdatabas, inkluderar detta inte tempdb nödvändigt. Dessutom kan det hända att en daglig säkerhetskopiering för en modelldatabas inte heller krävs – en veckosäkerhetskopiering räcker. För fullständiga dagliga säkerhetskopior, överväg master och msdb.

Med den enkla koden i Listing 2 tar vi en säkerhetskopia av msdb-databasen.

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

Ta bort jobb

När backupen är klar släpper vi jobben på instansen. Observera att för att ta bort jobb som skapats av en underhållsplan måste du radera underhållsplanerna som skapade dem (se figur 3).

Vanliga jobb kan tas bort genom att ta bort dem med GUI. Ett annat sätt är att köra koden från Listing 3, följt av koden från Listing 4.

Lista 3 genererar den uppsättning skript som krävs för att ta bort jobben. Sedan, i Lista 4, kör vi skript som genererats i Lista 3.

Du kan använda det här tillvägagångssättet även om jobbnamnen i ditt fall förmodligen skiljer sig från mina.

-- 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

Efter att ha lagt ner jobben kan vi verifiera att det inte finns några jobb kvar. Använd samma skript, som visas i Lista 1. Vi överväger två sätt för scenariot:

  1. Någon har av misstag tagit bort jobb och liknande objekt i en instans.
  2. Vi vill importera jobb från en instans till en annan.

Återställer msdb

Vi initierar återställningsoperationen med skriptet från Listing 5. I det skriptet börjar vi med att ställa in databasen på single_user-läge. Eftersom någon eller något (SQL Agent-konto?) kan vara inloggad i den här databasen är det nödvändigt.

Sedan utfärdar vi kommandot "restore" och ställer in den nya msdb-databasen till multi_user. Observera att vi använde alternativet REPLACE i återställningssatsen. Om du migrerar msdb till en ny instans kommer REPLACE-satsen att vara nödvändig. Utan det kan SQL Server returnera ett felmeddelande om att säkerhetskopian inte tillhör msdb-databasen på instansen.

-- 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

När återställningen är klar är de saknade jobben och andra objekt tillbaka. De kommer komplett med sina respektive jobbhistoriker. Alla relationer mellan jobben med databaser och andra objekt är intakta. Jobben fungerar som om ingen och ingenting någonsin tagit bort dem.

Slutsats

Vi kan enkelt migrera jobb och liknande objekt från en SQL Server-instans till en annan. För det behöver vi en säkerhetskopierings- och återställningsprocess av msdb. På samma sätt kan vi återställa dessa objekt på en SQL Server-instans om de går förlorade av någon anledning.


  1. kan inte ladda oci8 -> Allvarligt fel:Anrop till odefinierad funktion oci_connect()

  2. PostgreSQL v13 distribution och skalning med ClusterControl 1.8.2

  3. Beräkna och spara utrymme i PostgreSQL

  4. Vad är subqueries i oracle