SQL Server Agent ist eine Komponente, die für die Automatisierung von Datenbankaufgaben verwendet wird. Beispielsweise müssen wir die Indexwartung auf Produktionsservern nur außerhalb der Geschäftszeiten durchführen. Also erstellen wir einen SQL Server-Job zum Ausführen der Indexwartung und planen ihn außerhalb der Geschäftszeiten ein.
Wenn wir SQL Server installieren, wird der SQL Server Agent-Dienst deaktiviert. Zuerst aktivieren wir es und starten es manuell. Dann konfigurieren wir den SQL Server-Job mit SQL Server Management Studio und den gespeicherten Systemprozeduren der MSDB-Datenbank.
In diesem Artikel wird erläutert, wie Sie einen SQL Server-Job mithilfe der gespeicherten Systemprozeduren der MSDB-Datenbank erstellen.
Die im System gespeicherten Prozeduren der MSDB-Datenbank
SQL Server verwendet die folgenden:
- sp_add_job :Das Verfahren dient zum Erstellen eines neuen Jobs. Wenn es erfolgreich ist, gibt es @job_id zurück. Die folgenden Argumente sind anwendbar:
- @job_name:Dies ist ein eindeutiger Jobname.
- @enabled:Job ist aktiviert oder deaktiviert. Sobald ein Job erstellt wurde, können Sie den Wert des Parameters auf 1 setzen, um den Job zu aktivieren.
- @notify_level_eventlog:Dieser Parameter wird verwendet, um den Status des SQL-Jobs in der Windows-Ereignisanzeige zu schreiben.
Wert | Beschreibung |
0 | Das Ergebnis des Jobs wird nicht in das Ereignisprotokoll geschrieben. |
1 | Wenn der Job erfolgreich ausgeführt wird, wird das Ergebnis in die Ereignisanzeige geschrieben |
2 (Standardwert) | Wenn der Job fehlschlägt, werden das Ergebnis und die Fehlermeldung in die Ereignisanzeige geschrieben |
3 | Das Ergebnis des Jobs wird in die Ereignisanzeige geschrieben. |
- @notify_level_email:Dieser Parameter dient zum Versenden der E-Mail über das Ergebnis des SQL-Jobs. Die gültigen Werte des Parameters sind dieselben wie die @notify_level_eventlog-Argumentwerte.
- @notify_level_page:Dieser Parameter dient dazu, die Pager-Benachrichtigung über das Ergebnis des SQL-Jobs zu senden. Die gültigen Werte der Parameter sind dieselben wie die @notify_level_eventlog-Argumentwerte.
- @delete_level:Dieser Parameter dient dazu, den Job nach Beendigung zu löschen. In diesem Fall sollte der Wert des Parameters 1 sein. Beachten Sie, dass der Standardwert 0 ist; dann wird der Job nach Abschluss nicht gelöscht.
- @category_level:Dieser Parameter gibt die Jobkategoriewerte an. Der Standardwert ist NULL.
- @owner_login_name:Der Wert ist der Domänenname oder der SQL-Anmeldename des Auftragseigentümers.
2. Sp_add_jobserver: Diese gespeicherte Prozedur dient dazu, den Zielserver für die Ausführung des SQL-Jobs anzugeben. Die Prozedur akzeptiert die folgenden Argumente:
- @job_id:Es ist ein UNIQUEIDENTIFIER des SQL-Jobs. Der Standardwert dieses Arguments ist NULL.
- @job_name:Dies ist der Name des SQL-Jobs.
- @server_name:Dies ist der Name des Servers, auf dem Sie den SQL-Job ausführen möchten. Der Standardargumentwert kann der lokale Server (LOCAL) oder der Hostname des Zielservers sein.
3. sp_add_jobstep: Diese gespeicherte Prozedur dient zum Hinzufügen des Jobschritts in SQL Job. Die Prozedur verwendet die folgenden Argumente:
- @job_name:Der Name des Jobs, in dem Sie den Schritt hinzufügen. Es ist ein SYSNAME mit NULL als Standardwert.
- @step_name:Der Name des Schrittes. Es ist ein SYSNAME mit NULL als Standardwert.
- @step_id:Die fortlaufende ID des Jobschritts. Es ist eine fortlaufende Zahl ohne Lücke. Es ist ein INT-Wert und der Standardwert ist NULL.
- @cmdexec_success_code:Dieser Wert wird vom Subsystem CmdExec zurückgegeben. Es zeigt an, ob die Befehlsausführung erfolgreich war. Der Code ist ein int-Wert mit 0 als Standardwert.
- @on_sucess_action:Dieser Wert gibt die Aktion an, die ausgeführt werden soll, nachdem der Jobschritt erfolgreich abgeschlossen wurde. Die Werte können folgende sein:
Wert | Beschreibung |
1 | Job kündigen und Erfolg zurückgeben |
2 | Auftrag beenden und zurückgeben fehlgeschlagen |
3 | Zum nächsten Auftragsschritt gehen |
4 | Gehen Sie zur Schritt-ID von on_success_step_id |
- @on_fail_action:Geben Sie an, welche Aktion ausgeführt werden soll, wenn die Jobschritte fehlschlagen. Es ist ein INT-Wert und der Standardwert ist NULL.
- @retry_attempt:Geben Sie die Anzahl der Wiederholungsversuche nach dem Fehlschlagen des Jobschritts an. Es ist ein INT-Wert und der Standardwert ist NULL.
- @retry_interval:Legen Sie das Zeitintervall (Minuten) zwischen zwei fehlgeschlagenen Versuchen eines SQL-Jobschritts fest. Es ist ein INT-Wert und der Standardwert ist NULL.
- @os_run_priority:
- @Subsystem:Geben Sie den Namen des Subsystems an, das vom SQL Server-Agent zum Ausführen des Befehls verwendet wird. Die gültigen Werte sind die folgenden:
Subsystemwert | Beschreibung |
CmdExec | Betriebssystembefehl oder ausführbare Datei (*.exe,*.bat) |
ANALYSEABFRAGE | SQL Server-Analysedienst fragt ab, z. B. MDX, DMX. |
ANALYSEABFRAGE | SQL Server-Analysedienstbefehl, z. B. XMLA. |
SSIS | SQL Server-Integrationsdienstpaket. |
PowerShell | PowerShell-Befehl oder -Skript. |
T-SQL | T-SQL-Abfrage oder gespeicherte Prozedur |
Verteilung | SQL Server Replication Distributor Agent. |
Schnappschuss | Snapshot-Agent für die SQL Server-Replikation. |
LogReader | SQL Server-Replikationsprotokollleseagent. |
Queuereader | Leser der SQL Server-Replikationswarteschlange. |
- @command:Geben Sie den Befehl an, den der SQL Server Agent Service über das Subsystem ausführen soll. Der Datentyp ist varchar(max) und der Standardwert ist NULL.
- @Database_name:Geben Sie den Namen der Datenbank an, in der Sie den Befehl ausführen möchten. Dieser Parameter ist nützlich, wenn Sie ein T-SQL-Skript mit dem SQL Server-Agent ausführen.
4. Sp_add_jobschedule: Die gespeicherte Prozedur dient zum Erstellen des SQL-Job-Zeitplans. Diese Prozedur verwendet die folgenden Argumente:
- @job_name:Geben Sie den Namen des SQL-Jobs an. Der Zeitplan wird für den SQL-Job erstellt, der im @job_name-Argument angegeben ist.
- @name:der Name des Zeitplans. Der Datentyp ist varchar und der Standardwert ist NULL.
- @enabled:Setzen Sie 1, um den Zeitplan zu aktivieren, oder 0, um den Zeitplan zu deaktivieren.
- @freq_type:gibt die Zeit der Ausführung des SQL-Jobs an. Der Datentyp des Parameters ist INT, und der Standardwert ist 0. Gültige Werte sind:
Wert | Beschreibung |
1 | Der Job wird nur einmal ausgeführt. |
4 | Täglich. |
8 | Wöchentlich |
16 | Monatlich |
64 | Führen Sie den Job aus, wenn der SQL Server Agent-Dienst gestartet wird |
128 | Führen Sie den SQL-Job aus, wenn der Server im Leerlauf ist. |
- @freq_interval:gibt den Tag der Ausführung des SQL-Jobs an. Der Datentyp ist INT und der Standardwert ist 0. Der Wert hängt von dem Wert ab, der im Parameter @freq_type angegeben ist. Folgende Werte sind gültig:
Wert | Auswirkung auf den Jobplan |
1 (einmal) | Das @Freq_interval wird nicht verwendet. |
4 (täglich) | Alle @freq_interval Tage |
8 | Der Wert von @Freq_interval kann einer der folgenden sein: 1 =Sonntag 2 =Montag 4 =Dienstag 8 =Mittwoch 16 =Donnerstag 32 =Freitag 64 =Samstag |
16 | Führen Sie den Job auf @Freq_interval aus Tag des Monats |
64 | Das @Freq_interval wird nicht verwendet |
128 | Das @Freq_interval wird nicht verwendet |
- @freq_subday_type:Geben Sie die Einheit des freq_subday_interval an. Der Datentyp ist INT und der Standardwert ist NULL.
- @active_start_date:Legen Sie das Datum fest, an dem Sie die Jobausführung starten möchten. Der Datentyp ist INT und hat keinen Standardwert. Das Datumsformat ist JJJJMMTT. Der Wert muss größer oder gleich 19900101 sein.
- @active_end_date:Geben Sie das Datum an, an dem die Jobausführung gestoppt werden soll. Der Datentyp ist INT, ohne Standardwert. Das Datumsformat ist JJJJMMTT und der Wert muss größer oder gleich 19900101 sein.
- @active_start_time:Geben Sie die Uhrzeit an, zu der Sie die Jobausführung starten möchten. Der Datentyp ist INT, ohne einen Standardwert. Das Zeitformat ist HHMMSS.
- @active_end_time:Geben Sie die Zeit an, zu der Sie die Jobausführung stoppen möchten. Der Datentyp ist INT, ohne einen Standardwert. Das Zeitformat ist HHMMSS.
T-SQL-Code zum Erstellen eines SQL-Jobs
Zur Veranschaulichung der Abläufe verwenden wir den SQL Server 2019 auf der Workstation mit dem AdventureWorks2017 Datenbank, wiederhergestellt aus einer Sicherung. Wir erstellen einen SQL-Job namens Daily Full Backup – Es erstellt ein Backup von AdventureWorks2017 Datenbank und kopiert sie auf C:\Backups Ort.
Zuerst müssen wir die Agent XPs aktivieren. Es ist eine erweiterte Option. Daher aktivieren wir zuerst die erweiterte Konfigurationsoption und die Agent XPs-Komponente.
Führen Sie dazu die folgende Abfrage aus:
EXEC Sp_configure
'Show advanced options',
1
go
RECONFIGURE WITH override
EXEC Sp_configure
'Agent XPs',
1
go
RECONFIGURE WITH override
Sobald der Agent aktiviert ist, starten wir den Agentendienst.
Öffnen Sie SQL Server Management Studio und stellen Sie eine Verbindung mit der SQL Server-Instanz her. Klicken Sie dann mit der rechten Maustaste auf SQL Server Agent und klicken Sie auf Start .
Nach dem Start des Agenten können wir die SQL Server Agent Jobs erstellen.
Wie bereits erwähnt, erstellen wir einen SQL-Job, um eine Sicherung von AdventureWorks2017 zu erstellen Datenbank. Dazu führen wir den folgenden Befehl mit dem SQL Server Agent aus.
N'Backup Database [AdventureWorks2017] to disk=''C:\Backups\AdventureWorks2017.bak'' with compression'
So erstellen Sie einen neuen SQL-Job mit dem Namen Tägliche vollständige Sicherung Führen Sie das folgende Skript aus:
USE [msdb]
go
DECLARE @jobId BINARY(16)
EXEC msdb.dbo.Sp_add_job
@job_name=N'Daily Full Backup',
@enabled=1,
@notify_level_eventlog=0,
@notify_level_email=2,
@notify_level_page=2,
@delete_level=0,
@category_name=N'[Uncategorized (Local)]',
@owner_login_name=N'NISARG-PC\Nisarg',
@job_id = @jobId output
SELECT @jobId
go
Es wird den Job auf meiner lokalen Workstation ausführen. Daher fügen wir es dem Jobserver hinzu.
Führen Sie die folgende Abfrage aus:
EXEC msdb.dbo.Sp_add_jobserver
@job_name=N'Daily Full Backup',
@server_name = N'NISARG-PC'
go
Der Job-Step führt die Backup-Datenbank aus Befehl. Um den Auftragsschritt zu konfigurieren, verwenden Sie den folgenden Code:
USE [msdb]
go
EXEC msdb.dbo.Sp_add_jobstep
@job_name=N'Daily Full Backup',
@step_name=N'Generate Backup',
@step_id=1,
@cmdexec_success_code=0,
@on_success_action=1,
@on_fail_action=2,
@retry_attempts=0,
@retry_interval=0,
@os_run_priority=0,
@subsystem=N'TSQL',
@command=
N'Backup Database [AdventureWorks2017] to disk=''C:\Backups\AdventureWorks2017.bak'' with compression'
,
@database_name=N'master',
@flags=0
go
Der SQL-Job wird täglich um 1:00 Uhr ausgeführt. Um den Zeitplan zu konfigurieren, verwenden Sie den folgenden Code:
USE [msdb]
go
DECLARE @schedule_id INT
EXEC msdb.dbo.Sp_add_jobschedule
@job_name=N'Daily Full Backup',
@name=N'Run Backup At',
@enabled=1,
@freq_type=4,
@freq_interval=1,
@freq_subday_type=1,
@freq_subday_interval=0,
@freq_relative_interval=0,
@freq_recurrence_factor=1,
@active_start_date=20200918,
@active_end_date=99991231,
@active_start_time=10000,
@active_end_time=235959,
@schedule_id = @schedule_id output
SELECT @schedule_id
go
Der gesamte Code des Jobs lautet wie folgt:
USE [msdb]
go
DECLARE @jobId BINARY(16)
EXEC msdb.dbo.Sp_add_job
@job_name=N'Daily Full Backup',
@enabled=1,
@notify_level_eventlog=0,
@notify_level_email=2,
@notify_level_page=2,
@delete_level=0,
@category_name=N'[Uncategorized (Local)]',
@owner_login_name=N'NISARG-PC\Nisarg',
@job_id = @jobId output
SELECT @jobId
go
EXEC msdb.dbo.Sp_add_jobserver
@job_name=N'Daily Full Backup',
@server_name = N'NISARG-PC'
go
USE [msdb]
go
EXEC msdb.dbo.Sp_add_jobstep
@job_name=N'Daily Full Backup',
@step_name=N'Generate Backup',
@step_id=1,
@cmdexec_success_code=0,
@on_success_action=1,
@on_fail_action=2,
@retry_attempts=0,
@retry_interval=0,
@os_run_priority=0,
@subsystem=N'TSQL',
@command=
N'Backup Database [AdventureWorks2017] to disk=''C:\Backups\AdventureWorks2017.bak'' with compression'
,
@database_name=N'master',
@flags=0
go
USE [msdb]
go
DECLARE @schedule_id INT
EXEC msdb.dbo.Sp_add_jobschedule
@job_name=N'Daily Full Backup',
@name=N'Run Backup At',
@enabled=1,
@freq_type=4,
@freq_interval=1,
@freq_subday_type=1,
@freq_subday_interval=0,
@freq_relative_interval=0,
@freq_recurrence_factor=1,
@active_start_date=20200918,
@active_end_date=99991231,
@active_start_time=10000,
@active_end_time=235959,
@schedule_id = @schedule_id output
SELECT @schedule_id
go
Für die Demonstration führen wir den Job zuerst manuell aus, indem wir den folgenden Code ausführen:
use msdb
go
exec sp_start_job 'Daily Full Backup'
Sie können den Status des Auftrags anzeigen, indem Sie die folgende Abfrage ausführen:
SELECT NAME
AS [Job Name],
CONVERT(VARCHAR, Dateadd(s, ( run_time / 10000 ) * 60 * 60
+ ( ( run_time - ( run_time / 10000 ) *
10000 ) /
100 ) * 60
+ ( run_time - ( run_time / 100 ) * 100
), CONVERT(DATETIME, Rtrim(run_date), 113)), 100)
AS
[Job Executed Date and Time],
CASE
WHEN enabled = 1 THEN 'Enabled'
ELSE 'Disabled'
END
[Job Status],
CASE
WHEN JobHistory.run_status = 0 THEN 'Failed'
WHEN JobHistory.run_status = 1 THEN 'Succeeded'
WHEN JobHistory.run_status = 2 THEN 'Retry'
WHEN JobHistory.run_status = 3 THEN 'Cancelled'
ELSE 'Unknown'
END
[Job Outcome]
FROM sysjobhistory JobHistory
JOIN sysjobs Jobs
ON JobHistory.job_id = Jobs.job_id
WHERE NAME = 'Daily Full Backup'
Ausgabe:
Um die Sicherungsdatei anzuzeigen, öffnen Sie C:\Backups Standort:
Wie Sie sehen können, wurde die Sicherungsdatei erstellt.