SQL Server Agent е компонент, използван за автоматизация на задачите на базата данни. Например, трябва да извършваме поддръжка на индекса на производствените сървъри само в неработно време. И така, създаваме задание на SQL Server за поддържане на индекса и го планираме за „изключени“ часове.
Когато инсталираме SQL Server, услугата SQL Server Agent е деактивирана. Първо го активираме и стартираме ръчно. След това конфигурираме заданието на SQL Server, използвайки SQL Server Management Studio и системните съхранени процедури на базата данни MSDB.
Тази статия обяснява как да създадете задание на SQL Server с помощта на системните съхранени процедури на базата данни MSDB.
Системните съхранени процедури на базата данни MSDB
SQL Server използва следните:
- sp_add_job :процедурата е за създаване на нова работа. Ако е успешен, той връща @job_id. Приложими са следните аргументи:
- @job_name:Това е уникално име на работа.
- @enabled:Заданието е активирано или деактивирано. След като се създаде задание, можете да зададете стойността на параметъра като 1, за да активирате заданието.
- @notify_level_eventlog:Този параметър се използва за запис на състоянието на SQL заданието в програмата за преглед на събития в Windows.
Стойност | Описание |
0 | Резултатът от заданието няма да бъде записан в регистъра на събитията. |
1 | Ако задачата се изпълни успешно, резултатът ще бъде записан в инструмента за преглед на събития |
2 (стойност по подразбиране) | Ако заданието не успее, резултатът и съобщението за грешка ще бъдат записани в инструмента за преглед на събития |
3 | Резултатът от заданието се записва в инструмента за преглед на събития. |
- @notify_level_email:Този параметър служи за изпращане на имейл за резултата от SQL заданието. Валидните стойности на параметъра са същите като стойностите на аргумента @notify_level_eventlog.
- @notify_level_page:Този параметър служи за изпращане на известие на пейджъра за резултата от SQL заданието. Валидните стойности на параметрите са същите като стойностите на аргумента @notify_level_eventlog.
- @delete_level:Този параметър служи за изтриване на заданието след завършване. В този случай стойността на параметъра трябва да бъде 1. Имайте предвид, че стойността по подразбиране е 0; след това няма да изтрие заданието след завършване.
- @category_level:Този параметър показва стойностите на категорията работа. Стойността по подразбиране е NULL.
- @owner_login_name:Стойността е името на домейна или SQL входното име на собственика на заданието.
2. Sp_add_jobserver: Тази съхранена процедура служи за определяне на целевия сървър за изпълнение на SQL задание. Процедурата приема следните аргументи:
- @job_id:Това е УНИКАЛЕН ИДЕНТИФИКАТОР на SQL заданието. Стойността по подразбиране на този аргумент е NULL.
- @job_name:Това е името на SQL заданието.
- @име_сървъра:Това е името на сървъра, където искате да изпълните SQL заданието. Стойността на аргумента по подразбиране може да бъде локалният сървър (LOCAL) или името на хоста на целевия сървър.
3. sp_add_jobstep: Тази съхранена процедура работи за добавяне на стъпката на заданието в SQL Job. Процедурата използва следните аргументи:
- @job_name:Името на заданието, в което добавяте стъпката. Това е SYSNAME с NULL като стойност по подразбиране.
- @step_name:Името на стъпката. Това е SYSNAME с NULL като стойност по подразбиране.
- @step_id:Последователният идентификатор на стъпката на заданието. Това е нарастващо число без празнина. Това е INT стойност, а стойността по подразбиране е NULL.
- @cmdexec_success_code:Тази стойност се връща от подсистемата CmdExec. Показва дали изпълнението на командата е било успешно. Кодът е int стойност с 0 като стойност по подразбиране.
- @on_sucess_action:Тази стойност показва действието, което трябва да се извърши след успешното завършване на стъпката на заданието. Стойностите могат да бъдат някои от следните:
Стойност | Описание |
1 | Напуснете работата и върнете успех |
2 | Напуснете заданието и връщането не бе успешно |
3 | Отидете към следващата стъпка на заданието |
4 | Отидете към идентификатора на стъпката на on_success_step_id |
- @on_fail_action:посочете какво действие да извършите, ако стъпките на заданието не успеят. Това е INT стойност, а стойността по подразбиране е NULL.
- @retry_attempt:посочете броя на опитите за повторен опит след неуспех на стъпката на заданието. Това е INT стойност, а стойността по подразбиране е NULL.
- @retry_interval:задайте интервала от време (минути) между два опита за неуспешна стъпка на SQL задание. Това е INT стойност, а стойността по подразбиране е NULL.
- @os_run_priority:
- @Subsystem:посочете името на подсистемата, използвана от SQL Server Agent за изпълнение на командата. Валидните стойности са следните:
Стойност на подсистемата | Описание |
CmdExec | Команда на операционната система или изпълнимият файл (*.exe,*.bat) |
АНАЛИЗ | Запитвания за услуги за анализ на SQL Server, например MDX, DMX. |
АНАЛИЗ | Команда за услуга за анализ на SQL сървър, например XMLA. |
SSIS | Пакет услуги за интеграция на SQL Server. |
PowerShell | Команда или скрипт на PowerShell. |
T-SQL | T-SQL заявка или съхранена процедура |
Разпространение | Агент за разпространение на репликация на SQL Server. |
Моментна снимка | Агент за моментна снимка за репликация на SQL сървър. |
LogReader | Агент за четене на журнали за репликация на SQL сървър. |
Queuereader | Четец на опашка за репликация на SQL Server. |
- @command:посочете командата, която SQL Server Agent Service трябва да изпълни през подсистемата. Типът данни е varchar(max), а стойността по подразбиране е NULL.
- @Database_name:Посочете името на базата данни, където искате да изпълните командата. Този параметър е полезен, когато изпълнявате T-SQL скрипт с помощта на SQL Server Agent.
4. Sp_add_jobschedule: съхранената процедура служи за създаване на график за SQL задания. Тази процедура използва следните аргументи:
- @име_на_задание:посочете името на SQL заданието. Графикът ще бъде направен за SQL заданието, посочено в аргумента @job_name.
- @name:името на графика. Типът данни е varchar, а стойността по подразбиране е NULL.
- @enabled:задайте 1, за да активирате графика, или 0, за да деактивирате графика.
- @freq_type:показва времето на изпълнение на SQL заданието. Типът данни на параметъра е INT, а стойността по подразбиране е 0. Валидните стойности са някои от следните:
Стойност | Описание |
1 | Заданието ще бъде изпълнено само веднъж. |
4 | Ежедневно. |
8 | Седмично |
16 | Месечно |
64 | Изпълнете заданието, когато стартира услугата за агент на SQL Server |
128 | Изпълнете SQL заданието, когато сървърът е неактивен. |
- @freq_interval:показва деня на изпълнение на SQL заданието. Типът данни е INT, а стойността по подразбиране е 0. Стойността зависи от стойността, посочена в параметъра @freq_type. Валидните стойности са някои от следните:
Стойност | Ефект върху графика за работа |
1 (веднъж) | @Freq_interval няма да се използва. |
4 (Ежедневно) | Всеки @freq_interval дни |
8 | Стойността на @Freq_interval може да бъде някое от следните: 1 =неделя 2 =понеделник 4 =вторник 8 =сряда 16 =четвъртък 32 =петък 64 =събота |
16 | Изпълнете заданието на @Freq_interval ден от месеца |
64 | @Freq_interval няма да се използва |
128 | @Freq_interval няма да се използва |
- @freq_subday_type:посочете единицата на freq_subday_interval. Типът данни е INT, а стойността по подразбиране е NULL.
- @active_start_date:задайте датата, на която искате да започнете изпълнението на заданието. Типът данни е INT и няма стойност по подразбиране. Форматът на датата е ГГГГММДД. Стойността трябва да е по-голяма или равна на 19900101.
- @active_end_date:посочете датата, когато да спрете изпълнението на заданието. Типът данни е INT, без стойност по подразбиране. Форматът на датата е ГГГГММДД, а стойността трябва да е по-голяма или равна на 19900101.
- @active_start_time:посочете времето, когато искате да започнете изпълнението на заданието. Типът данни е INT, без стойност по подразбиране. Форматът на часа е HHMMSS.
- @active_end_time:посочете времето, когато искате да спрете изпълнението на заданието. Типът данни е INT, без стойност по подразбиране. Форматът на часа е HHMMSS.
T-SQL код за създаване на SQL задание
За да илюстрираме процесите, използваме SQL Server 2019 на работната станция с AdventureWorks2017 база данни, възстановена от резервно копие. Създаваме SQL задание с име Ежедневно пълно архивиране – генерира резервно копие на AdventureWorks2017 база данни и я копира в C:\Backups местоположение.
Първо, трябва да активираме Agent XPs. Това е усъвършенствана опция. Затова първо активираме опцията за разширена конфигурация и компонента Agent XPs.
За да направите това, изпълнете следната заявка:
EXEC Sp_configure
'Show advanced options',
1
go
RECONFIGURE WITH override
EXEC Sp_configure
'Agent XPs',
1
go
RECONFIGURE WITH override
След като агентът е активиран, стартираме услугата за агент.
Отворете SQL Server Management Studio и се свържете с екземпляра на SQL Server. След това щракнете с десния бутон върху SQL Server Agent и щракнете върху Старт .
След стартирането на агента можем да създадем задания за агент на SQL Server.
Както споменахме, ще създадем SQL задание за генериране на резервно копие на AdventureWorks2017 база данни. За това изпълняваме следната команда с помощта на SQL Server Agent.
N'Backup Database [AdventureWorks2017] to disk=''C:\Backups\AdventureWorks2017.bak'' with compression'
За да създадете ново SQL задание с име Ежедневно пълно архивиране, изпълнете следния скрипт:
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
Той ще изпълни задачата на моята локална работна станция. По този начин го добавяме към Job Server.
Изпълнете следната заявка:
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
SQL Job ще се изпълнява всеки ден в 1:00 часа сутринта. За да конфигурирате графика, използвайте следния код:
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
Целият код на заданието е както следва:
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
Първо изпълняваме заданието ръчно за демонстрация, като изпълним кода по-долу:
use msdb
go
exec sp_start_job 'Daily Full Backup'
Можете да видите състоянието на заданието, като изпълните следната заявка:
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'
Изход:
За да видите архивния файл, отворете C:\Backups местоположение:
Както можете да видите, архивният файл е създаден.