Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

So migrieren Sie SQL Server-Jobs von einer SQL Server-Instanz zu einer anderen

Einführung

In einem früheren Artikel haben wir hervorgehoben, dass die msdb-Datenbank praktisch alle Objekte im Zusammenhang mit der Automatisierung speichert. In diesem Artikel untersuchen wir den Fall des Verschiebens von Jobs und Objekten zwischen den SQL Server-Instanzen.

Beginnen wir mit der Liste der Objekte, die in dieser Instanz von SQL Server in msdb gespeichert sind.

Wir haben mehrere Jobs mit einem Wartungsplan erstellt (siehe Artikel Erstellen von Wartungsplänen in SQL Server). Wir haben auch zwei Warnungen und einen Operator. Msdb speichert auch Warnungen und Operatoren (siehe Abbildung 1). Wir löschen diese Objekte und stellen sie dann wieder her, indem wir eine Sicherungskopie der msdb-Datenbank wiederherstellen.

In msdb gespeicherte Objekte anzeigen

Wenn wir relevante Systemobjekte abfragen, sehen wir diese Objekte auch als Ergebnismenge zurückgegeben. (Siehe Listing 1, Abbildung 2). Msdb speichert auch die Systemkataloge mit Aufzeichnungen von Jobs, Sicherungsprotokollen, Bedienern, Wartungsstellen, Datenbank-E-Mails und anderen Elementen im Zusammenhang mit der Automatisierung.

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

MSDB sichern

Um das Konzept für eine einzelne Instanz von SQL Server zu veranschaulichen, erstellen wir zuerst eine Sicherung der msdb-Datenbank. In Produktionsszenarien sollten regelmäßige Sicherungen Ihrer Systemdatenbanken Teil Ihrer Strategie sein. Sie sind in der Regel klein genug, um problemlos in einen täglichen vollständigen Backup-Zeitplan zu passen.

Wenn ich mich auf eine Systemdatenbank beziehe, ist natürlich keine tempdb erforderlich. Darüber hinaus ist möglicherweise auch kein tägliches Backup für eine Modelldatenbank erforderlich – ein wöchentliches Backup ist ausreichend. Ziehen Sie für die vollständigen täglichen Sicherungen master und msdb in Betracht.

Mit dem einfachen Code in Listing 2 erstellen wir ein Backup der msdb-Datenbank.

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

Stellenabbau

Sobald das Backup fertig ist, löschen wir die Jobs auf der Instanz. Beachten Sie, dass das Löschen der Jobs, die von einem Wartungsplan erstellt wurden, das Löschen der Wartungspläne erfordert, die sie erstellt haben (siehe Abbildung 3).

Reguläre Jobs können entfernt werden, indem sie mit der GUI gelöscht werden. Eine andere Möglichkeit besteht darin, den Code aus Listing 3 auszuführen, gefolgt vom Code aus Listing 4.

Listing 3 generiert den Satz von Skripten, die zum Löschen der Jobs erforderlich sind. Dann führen wir in Listing 4 die in Listing 3 generierten Skripte aus.

Sie können diesen Ansatz verwenden, obwohl sich die Jobnamen in Ihrer Instanz wahrscheinlich von meinen unterscheiden.

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

Nach dem Löschen der Jobs können wir überprüfen, ob keine Jobs mehr übrig sind. Verwenden Sie dasselbe Skript wie in Listing 1. Wir betrachten zwei Möglichkeiten für das Szenario:

  1. Jemand hat versehentlich Jobs und ähnliche Objekte in einer Instanz gelöscht.
  2. Wir wollen Jobs von einer Instanz in eine andere importieren.

msdb wird wiederhergestellt

Wir leiten den Wiederherstellungsvorgang mit dem Skript aus Listing 5 ein. In diesem Skript beginnen wir damit, die Datenbank in den Einzelbenutzermodus zu versetzen. Da jemand oder etwas (SQL-Agent-Konto?) bei dieser Datenbank angemeldet sein könnte, ist dies erforderlich.

Dann führen wir den Befehl „restore“ aus und setzen die neue msdb-Datenbank auf multi_user. Beachten Sie, dass wir die Option REPLACE in der Wiederherstellungsanweisung verwendet haben. Wenn Sie msdb zu einer neuen Instanz migrieren, ist die REPLACE-Klausel erforderlich. Ohne sie gibt SQL Server möglicherweise einen Fehler zurück, dass der Sicherungssatz nicht zur msdb-Datenbank auf der Instanz gehört.

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

Sobald der Wiederherstellungsvorgang abgeschlossen ist, sind die fehlenden Jobs und andere Objekte wieder da. Sie kommen komplett mit ihren jeweiligen beruflichen Werdegängen. Alle Beziehungen zwischen den Jobs mit Datenbanken und anderen Objekten sind intakt. Die Jobs funktionieren, als ob sie nie jemand und nichts gelöscht hätte.

Schlussfolgerung

Wir können Jobs und ähnliche Objekte problemlos von einer SQL Server-Instanz zu einer anderen migrieren. Dazu benötigen wir einen Sicherungs- und Wiederherstellungsprozess von msdb. Ebenso können wir diese Objekte auf einer SQL Server-Instanz wiederherstellen, wenn sie aus irgendeinem Grund verloren gehen.