SQL Server Agent to komponent służący do automatyzacji zadań bazodanowych. Na przykład musimy przeprowadzać konserwację indeksu na serwerach produkcyjnych tylko poza godzinami pracy. Dlatego tworzymy zadanie SQL Server polegające na prowadzeniu konserwacji indeksów i planujemy je na godziny „wyłączone”.
Kiedy instalujemy SQL Server, usługa SQL Server Agent jest wyłączona. Najpierw włączamy go i uruchamiamy ręcznie. Następnie konfigurujemy zadanie SQL Server, używając SQL Server Management Studio i systemowych procedur przechowywanych w bazie danych MSDB.
W tym artykule wyjaśniono, jak utworzyć zadanie SQL Server przy użyciu systemowych procedur przechowywanych w bazie danych MSDB.
Systemowe procedury składowane bazy danych MSDB
SQL Server używa następujących:
- sp_add_job :procedura służy do tworzenia nowej pracy. Jeśli się powiedzie, zwraca @job_id. Mają zastosowanie następujące argumenty:
- @job_name:To unikalna nazwa pracy.
- @enabled:zadanie jest włączone lub wyłączone. Po utworzeniu zadania możesz ustawić wartość parametru na 1, aby włączyć zadanie.
- @notify_level_eventlog:Ten parametr jest używany do zapisywania stanu zadania SQL w przeglądarce zdarzeń Windows.
Wartość | Opis |
0 | Wynik zadania nie zostanie zapisany w dzienniku zdarzeń. |
1 | Jeśli zadanie zostanie wykonane pomyślnie, wynik zostanie zapisany w przeglądarce zdarzeń |
2 (wartość domyślna) | Jeśli zadanie się nie powiedzie, wynik i komunikat o błędzie zostaną zapisane w przeglądarce zdarzeń |
3 | Wynik zadania jest zapisywany w przeglądarce zdarzeń. |
- @notify_level_email:Ten parametr służy do wysyłania wiadomości e-mail o wyniku zadania SQL. Prawidłowe wartości parametru są takie same jak wartości argumentu @notify_level_eventlog.
- @notify_level_page:Ten parametr służy do wysyłania powiadomienia pagera o wyniku zadania SQL. Prawidłowe wartości parametrów są takie same jak wartości argumentów @notify_level_eventlog.
- @delete_level:Ten parametr służy do usuwania zadania po zakończeniu. W takim przypadku wartość parametru powinna wynosić 1. Zauważ, że wartość domyślna to 0; wtedy nie usunie zadania po zakończeniu.
- @category_level:Ten parametr wskazuje wartości kategorii stanowisk. Domyślna wartość to NULL.
- @owner_login_name:wartością jest nazwa domeny lub nazwa logowania SQL właściciela zadania.
2. Sp_add_jobserver: Ta procedura składowana służy do określenia serwera docelowego do wykonania zadania SQL. Procedura akceptuje następujące argumenty:
- @job_id:Jest to UNIKATOWY IDENTYFIKATOR zadania SQL. Domyślna wartość tego argumentu to NULL.
- @nazwa_pracy:Jest to nazwa zadania SQL.
- @nazwa_serwera:Jest to nazwa serwera, na którym chcesz uruchomić zadanie SQL. Domyślną wartością argumentu może być serwer lokalny (LOKALNY) lub nazwa hosta serwera docelowego.
3. sp_add_jobstep: Ta procedura składowana służy do dodawania kroku zadania w zadaniu SQL. Procedura wykorzystuje następujące argumenty:
- @job_name:Nazwa pracy, w której dodajesz krok. Jest to SYSNAME z NULL jako wartością domyślną.
- @step_name:nazwa kroku. Jest to SYSNAME z NULL jako wartością domyślną.
- @step_id:sekwencyjny identyfikator kroku zadania. Jest to liczba przyrostowa bez przerwy. Jest to wartość INT, a domyślna wartość to NULL.
- @cmdexec_success_code:Ta wartość jest zwracana przez podsystem CmdExec. Wskazuje, czy wykonanie polecenia powiodło się. Kod to wartość int z 0 jako wartością domyślną.
- @on_sucess_action:Ta wartość wskazuje akcję, która powinna zostać wykonana po pomyślnym zakończeniu etapu zadania. Wartości mogą być dowolne z następujących:
Wartość | Opis |
1 | Zakończ pracę i odnieś sukces |
2 | Zakończ pracę i powrót nie powiódł się |
3 | Przejdź do następnego kroku pracy |
4 | Przejdź do identyfikatora kroku on_success_step_id |
- @on_fail_action:określ, jakie działanie należy wykonać, jeśli etapy zadania nie powiodą się. Jest to wartość INT, a domyślna wartość to NULL.
- @retry_attempt:określ liczbę ponownych prób po niepowodzeniu kroku zadania. Jest to wartość INT, a domyślna wartość to NULL.
- @retry_interval:ustaw odstęp czasu (w minutach) między dwiema próbami niepowodzenia kroku zadania SQL. Jest to wartość INT, a domyślna wartość to NULL.
- @os_run_priority:
- @Podsystem:określ nazwę podsystemu używanego przez agenta SQL Server do wykonania polecenia. Prawidłowe wartości są następujące:
Wartość podsystemu | Opis |
CmdExec | Polecenie systemu operacyjnego lub plik wykonywalny (*.exe,*.bat) |
ZAPYTANIE ANALIZY | Kwerendy usługi analizy SQL Server, na przykład MDX, DMX. |
ZAPYTANIE ANALIZY | Polecenie usługi analizy SQL Server, na przykład XMLA. |
SSIS | Pakiet usług integracji SQL Server. |
PowerShell | Polecenie lub skrypt PowerShell. |
T-SQL | Kwerenda T-SQL lub procedura składowana |
Dystrybucja | Agent dystrybutora replikacji SQL Server. |
Migawka | Agent migawek replikacji SQL Server. |
LogReader | Agent czytnika dzienników replikacji serwera SQL. |
Kolejnik | Czytnik kolejki replikacji SQL Server. |
- @command:określ polecenie, które usługa agenta SQL Server powinna wykonać za pośrednictwem podsystemu. Typ danych to varchar(max), a domyślna wartość to NULL.
- @Nazwa_bazy_danych:Określ nazwę bazy danych, w której chcesz uruchomić polecenie. Ten parametr jest przydatny, gdy uruchamiasz skrypt T-SQL przy użyciu agenta serwera SQL.
4. Sp_add_jobschedule: procedura składowana służy do tworzenia harmonogramu zadań SQL. Ta procedura wykorzystuje następujące argumenty:
- @nazwa_zadania:określ nazwę zadania SQL. Harmonogram zostanie utworzony dla zadania SQL określonego w argumencie @nazwa_pracy.
- @name:nazwa harmonogramu. Typ danych to varchar, a domyślna wartość to NULL.
- @enabled:ustaw 1, aby włączyć harmonogram lub 0, aby wyłączyć harmonogram.
- @freq_type:wskazuje czas wykonania zadania SQL. Typ danych parametru to INT, a wartość domyślna to 0. Prawidłowe wartości to dowolne z poniższych:
Wartość | Opis |
1 | Zadanie zostanie wykonane tylko raz. |
4 | Codziennie. |
8 | Co tydzień |
16 | Miesięcznie |
64 | Wykonaj zadanie po uruchomieniu usługi agenta SQL Server |
128 | Wykonaj zadanie SQL, gdy serwer jest bezczynny. |
- @freq_interval:wskazuje dzień wykonania zadania SQL. Typ danych to INT, a wartość domyślna to 0. Wartość zależy od wartości określonej w parametrze @freq_type. Prawidłowe wartości to dowolne z następujących:
Wartość | Wpływ na harmonogram pracy |
1 (raz) | @Freq_interval nie będą używane. |
4 (codziennie) | Każdy @freq_interval dni |
8 | Wartość @Freq_interval może być jedną z następujących: 1 =niedziela 2 =poniedziałek 4 =wtorek 8 =środa 16 =czwartek 32 =piątek 64 =sobota |
16 | Uruchom zadanie na @Freq_interval dzień miesiąca |
64 | @Freq_interval nie będzie używany |
128 | @Freq_interval nie będzie używany |
- @freq_subday_type:określ jednostkę freq_subday_interval. Typ danych to INT, a wartość domyślna to NULL.
- @active_start_date:ustaw datę rozpoczęcia wykonywania zadania. Typ danych to INT i nie ma wartości domyślnej. Format daty to RRRRMMDD. Wartość musi być większa lub równa 19900101.
- @active_end_date:określ datę zatrzymania wykonywania zadania. Typ danych to INT, bez wartości domyślnej. Format daty to RRRRMMDD, a wartość musi być większa lub równa 19900101.
- @active_start_time:określ czas, w którym chcesz rozpocząć wykonywanie zadania. Typ danych to INT, bez wartości domyślnej. Format czasu to GGMMSS.
- @active_end_time:określ czas, w którym chcesz zatrzymać wykonywanie zadania. Typ danych to INT, bez wartości domyślnej. Format czasu to GGMMSS.
Kod T-SQL do tworzenia zadania SQL
Aby zilustrować procesy, używamy SQL Server 2019 na stacji roboczej z AdventureWorks2017 baza danych, przywrócona z kopii zapasowej. Tworzymy zadanie SQL o nazwie Codzienna pełna kopia zapasowa – generuje kopię zapasową AdventureWorks2017 i kopiuje ją do C:\Backups lokalizacja.
Najpierw musimy włączyć Agenta XP. Jest to opcja zaawansowana. Dlatego najpierw włączamy opcję zaawansowanej konfiguracji i komponent Agent XPs.
Aby to zrobić, uruchom następujące zapytanie:
EXEC Sp_configure
'Show advanced options',
1
go
RECONFIGURE WITH override
EXEC Sp_configure
'Agent XPs',
1
go
RECONFIGURE WITH override
Po włączeniu Agenta uruchamiamy usługę Agenta.
Otwórz SQL Server Management Studio i połącz się z instancją SQL Server. Następnie kliknij prawym przyciskiem myszy SQL Server Agent i kliknij Start .
Po uruchomieniu agenta możemy utworzyć zadania agenta SQL Server.
Jak wspomniano, utworzymy zadanie SQL, aby wygenerować kopię zapasową AdventureWorks2017 Baza danych. W tym celu uruchamiamy następujące polecenie za pomocą agenta serwera SQL.
N'Backup Database [AdventureWorks2017] to disk=''C:\Backups\AdventureWorks2017.bak'' with compression'
Aby utworzyć nowe zadanie SQL o nazwie Codzienna pełna kopia zapasowa, wykonaj następujący skrypt:
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
Wykona pracę na mojej lokalnej stacji roboczej. Dlatego dodajemy go do serwera zadań.
Wykonaj następujące zapytanie:
EXEC msdb.dbo.Sp_add_jobserver
@job_name=N'Daily Full Backup',
@server_name = N'NISARG-PC'
go
Etap zadania wykonuje bazę danych zapasowych Komenda. Aby skonfigurować etap zadania, użyj następującego kodu:
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
Zadanie SQL będzie uruchamiane codziennie o godzinie 1:00. Aby skonfigurować harmonogram, użyj następującego kodu:
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
Cały kod zadania wygląda następująco:
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
Najpierw uruchamiamy zadanie ręcznie na potrzeby demonstracji, wykonując poniższy kod:
use msdb
go
exec sp_start_job 'Daily Full Backup'
Możesz wyświetlić stan zadania, uruchamiając następujące zapytanie:
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'
Wyjście:
Aby wyświetlić plik kopii zapasowej, otwórz C:\Backups lokalizacja:
Jak widać, plik kopii zapasowej został utworzony.