sql >> Databáze >  >> RDS >> Sqlserver

Nakonfigurujte úlohy SQL na serveru SQL pomocí T-SQL

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

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


  1. Optimalizace výkonu dotazů v MySQL

  2. Jak vybrat vnořený JSON v SQL Server s OPENJSON

  3. Existuje způsob, jak nepoužívat hranaté závorky v SQL Server?

  4. Jak naplnit kalendářní tabulku v Oracle?