SQL Server Agent je komponenta používaná pro automatizaci databázových úloh. Potřebujeme například provádět údržbu indexu na produkčních serverech pouze mimo pracovní dobu. Vytváříme tedy úlohu SQL Serveru se spuštěním údržby indexu a naplánujeme ji na „vypnuté“ hodiny.
Když nainstalujeme SQL Server, služba SQL Server Agent je zakázána. Nejprve jej povolíme a spustíme ručně. Poté nakonfigurujeme úlohu SQL Server pomocí SQL Server Management Studio a systémových uložených procedur databáze MSDB.
Tento článek vysvětluje, jak vytvořit úlohu SQL Server pomocí systémových uložených procedur databáze MSDB.
Systém uložené procedury databáze MSDB
SQL Server používá následující:
- sp_add_job :postup je pro vytvoření nového pracovního místa. Pokud je úspěšný, vrátí @job_id. Platí následující argumenty:
- @job_name:Jde o jedinečný název úlohy.
- @enabled:Úloha je povolena nebo zakázána. Jakmile je úloha vytvořena, můžete nastavit hodnotu parametru na 1 a úlohu povolit.
- @notify_level_eventlog:Tento parametr se používá k zápisu stavu úlohy SQL v prohlížeči událostí Windows.
Hodnota | Popis |
0 | Výsledek úlohy nebude zapsán do protokolu událostí. |
1 | Pokud se úloha úspěšně provede, výsledek se zapíše do prohlížeče událostí |
2 (výchozí hodnota) | Pokud se úloha nezdaří, výsledek a chybová zpráva budou zapsány do prohlížeče událostí |
3 | Výsledek úlohy se zapíše do prohlížeče událostí. |
- @notify_level_email:Tento parametr slouží k odeslání e-mailu o výsledku úlohy SQL. Platné hodnoty parametru jsou stejné jako hodnoty argumentu @notify_level_eventlog.
- @notify_level_page:Tento parametr slouží k odeslání upozornění pageru na výsledek úlohy SQL. Platné hodnoty parametrů jsou stejné jako hodnoty argumentu @notify_level_eventlog.
- @delete_level:Tento parametr slouží k odstranění úlohy po dokončení. V tomto případě by hodnota parametru měla být 1. Všimněte si, že výchozí hodnota je 0; poté úlohu po dokončení nesmaže.
- @category_level:Tento parametr označuje hodnoty kategorie úlohy. Výchozí hodnota je NULL.
- @owner_login_name:Hodnota je název domény nebo přihlašovací jméno SQL vlastníka úlohy.
2. Sp_add_jobserver: Tato uložená procedura slouží k určení cílového serveru pro provedení úlohy SQL. Procedura přijímá následující argumenty:
- @job_id:Jde o JEDINEČNÝ IDENTIFIKACE úlohy SQL. Výchozí hodnota tohoto argumentu je NULL.
- @job_name:Je to název úlohy SQL.
- @název_serveru:Je to název serveru, na kterém chcete spustit úlohu SQL. Výchozí hodnotou argumentu může být místní server (LOCAL) nebo název hostitele cílového serveru.
3. sp_add_jobstep: Tato uložená procedura funguje pro přidání kroku úlohy do úlohy SQL. Procedura používá následující argumenty:
- @job_name:Název úlohy, do které přidáváte krok. Je to SYSNAME s výchozí hodnotou NULL.
- @název_kroku:Název kroku. Je to SYSNAME s výchozí hodnotou NULL.
- @step_id:Sekvenční ID kroku úlohy. Je to přírůstkové číslo bez mezery. Je to hodnota INT a výchozí hodnota je NULL.
- @cmdexec_success_code:Tato hodnota je vrácena subsystémem CmdExec. Označuje, zda bylo provedení příkazu úspěšné. Kód je hodnota int s výchozí hodnotou 0.
- @on_sucess_action:Tato hodnota označuje akci, která by měla být provedena po úspěšném dokončení kroku úlohy. Hodnoty mohou být libovolné z následujících:
Hodnota | Popis |
1 | Ukončit práci a vrátit se k úspěchu |
2 | Ukončit úlohu a návrat se nezdařil |
3 | Přejít na další krok úlohy |
4 | Přejděte na id kroku on_success_step_id |
- @on_fail_action:zadejte, jaká akce se má provést, pokud kroky úlohy selžou. Je to hodnota INT a výchozí hodnota je NULL.
- @retry_attempt:zadejte počet pokusů o opakování po selhání kroku úlohy. Je to hodnota INT a výchozí hodnota je NULL.
- @retry_interval:nastavte časový interval (minuty) mezi dvěma pokusy o selhání kroku úlohy SQL. Je to hodnota INT a výchozí hodnota je NULL.
- @os_run_priority:
- @Subsystem:zadejte název podsystému, který SQL Server Agent používá ke spuštění příkazu. Platné hodnoty jsou následující:
Hodnota podsystému | Popis |
CmdExec | Příkaz operačního systému nebo spustitelný soubor (*.exe,*.bat) |
ANALYSISQUERY | Dotazy služby analýzy serveru SQL, například MDX, DMX. |
ANALYSISQUERY | Příkaz služby analýzy serveru SQL, například XMLA. |
SSIS | Balík služeb integrace SQL Server. |
PowerShell | Příkaz nebo skript PowerShell. |
T-SQL | Dotaz T-SQL nebo uložená procedura |
Distribuce | Agent distributora replikace SQL Server. |
Snímek | Agent snímku replikace serveru SQL. |
LogReader | Agent čtečky protokolu replikace serveru SQL. |
Queuereader | Čtečka fronty replikace serveru SQL. |
- @command:zadejte příkaz, který má služba SQL Server Agent Service provést prostřednictvím subsystému. Typ dat je varchar(max) a výchozí hodnota je NULL.
- @Jméno_databáze:Zadejte název databáze, ve které chcete příkaz spustit. Tento parametr je užitečný, když spouštíte skript T-SQL pomocí SQL Server Agent.
4. Sp_add_jobschedule: uložená procedura slouží k vytvoření plánu úlohy SQL. Tento postup používá následující argumenty:
- @job_name:zadejte název úlohy SQL. Plán bude vytvořen pro úlohu SQL zadanou v argumentu @job_name.
- @name:název plánu. Typ dat je varchar a výchozí hodnota je NULL.
- @enabled:nastavte 1 pro povolení plánu nebo 0 pro deaktivaci plánu.
- @freq_type:označuje čas provedení úlohy SQL. Datový typ parametru je INT a výchozí hodnota je 0. Platné hodnoty jsou některé z následujících:
Hodnota | Popis |
1 | Úloha bude provedena pouze jednou. |
4 | Denně. |
8 | Týdně |
16 | Měsíčně |
64 | Proveďte úlohu při spuštění služby SQL Server Agent Service |
128 | Proveďte úlohu SQL, když je server nečinný. |
- @freq_interval:označuje den provedení úlohy SQL. Datový typ je INT a výchozí hodnota je 0. Hodnota závisí na hodnotě zadané v parametru @freq_type. Platné hodnoty jsou některé z následujících:
Hodnota | Vliv na plán úlohy |
1 (jednou) | @Freq_interval nebudou použity. |
4 (denně) | Každý @freq_interval dnů |
8 | Hodnota @Freq_interval může být jakákoli z následujících: 1 =neděle 2 =pondělí 4 =úterý 8 =středa 16 =čtvrtek 32 =pátek 64 =sobota |
16 | Spusťte úlohu v @Freq_interval den v měsíci |
64 | @Freq_interval nebude použit |
128 | @Freq_interval nebude použit |
- @freq_subday_type:zadejte jednotku freq_subday_interval. Typ dat je INT a výchozí hodnota je NULL.
- @active_start_date:nastavte datum, kdy chcete zahájit provádění úlohy. Datový typ je INT a nemá výchozí hodnotu. Formát data je RRRRMMDD. Hodnota musí být větší nebo rovna 19900101.
- @active_end_date:zadejte datum, kdy se má zastavit provádění úlohy. Datový typ je INT, bez výchozí hodnoty. Formát data je RRRRMMDD a hodnota musí být větší nebo rovna 19900101.
- @active_start_time:zadejte čas, kdy chcete zahájit provádění úlohy. Datový typ je INT, bez výchozí hodnoty. Formát času je HHMMSS.
- @active_end_time:zadejte čas, kdy chcete zastavit provádění úlohy. Datový typ je INT, bez výchozí hodnoty. Formát času je HHMMSS.
Kód T-SQL pro vytvoření úlohy SQL
Pro ilustraci procesů používáme SQL Server 2019 na pracovní stanici s AdventureWorks2017 databáze, obnovená ze zálohy. Vytvoříme úlohu SQL s názvem Daily Full Backup – vygeneruje zálohu AdventureWorks2017 databázi a zkopíruje ji do C:\Backups umístění.
Nejprve musíme povolit Agent XP. Je to pokročilá možnost. Proto nejprve povolíme možnost pokročilé konfigurace a komponentu Agent XPs.
Chcete-li to provést, spusťte následující dotaz:
EXEC Sp_configure
'Show advanced options',
1
go
RECONFIGURE WITH override
EXEC Sp_configure
'Agent XPs',
1
go
RECONFIGURE WITH override
Jakmile je Agent povolen, spustíme službu Agent.
Otevřete SQL Server Management Studio a připojte se k instanci SQL Server. Poté klikněte pravým tlačítkem na SQL Server Agent a klikněte na Start .
Po spuštění agenta můžeme vytvořit úlohy agenta SQL Server.
Jak již bylo zmíněno, vytvoříme úlohu SQL pro vygenerování zálohy AdventureWorks2017 databáze. Za tímto účelem spustíme následující příkaz pomocí SQL Server Agent.
N'Backup Database [AdventureWorks2017] to disk=''C:\Backups\AdventureWorks2017.bak'' with compression'
Chcete-li vytvořit novou úlohu SQL s názvem Daily Full Backup, spusťte následující skript:
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
Provede úlohu na mé místní pracovní stanici. Proto jej přidáme na Job Server.
Proveďte následující dotaz:
EXEC msdb.dbo.Sp_add_jobserver
@job_name=N'Daily Full Backup',
@server_name = N'NISARG-PC'
go
Krok úlohy spustí záložní databázi příkaz. Ke konfiguraci kroku úlohy použijte následující kód:
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
Úloha SQL bude spouštěna denně v 1:00. Ke konfiguraci plánu použijte následující kód:
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
Celý kód úlohy je následující:
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
Nejprve spustíme úlohu ručně pro ukázku spuštěním kódu níže:
use msdb
go
exec sp_start_job 'Daily Full Backup'
Stav úlohy můžete zobrazit spuštěním následujícího dotazu:
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'
Výstup:
Chcete-li zobrazit soubor zálohy, otevřete C:\Backups umístění:
Jak můžete vidět, záložní soubor byl vytvořen.