Функционал для управления и контроля заданиями агента SQL Server.
При обслуживании множества серверов может понадобиться настроить автосоздание типовых заданий и поддержание настроек этих заданий в актуальном состоянии.
Для этих целей имеется таблица шаблонов JobTemplates, в которой можно хранить шаблоны настроек заданий в двух вариантах.
Эти задания создаются в единственном экземпляре на один инстанс SQL Server. Например, могут использоваться для каких-то глобавльных задач по всему серверу.
По умолчанию таких заданий добавлено два для слежубной базы:
- SQLServerMaintenance.ControlTransactionLogUsage - задание контроля использования логов транзакций.
- SQLServerMaintenance.ControlJobsExecutionTimeout - задание контроля выполнения заданий агента SQL Server в части превышения таймаута выполнения.
В качестве примера рассмотрим добавление настроек для SQLServerMaintenance.ControlTransactionLogUsage. В таблицу JobTemplates добавлена следующая запись:
INSERT [dbo].[JobTemplates] (
[UseSetting],
[Enable],
[ApplyTemplateQuery],
[Name],
[Description],
[JobAction],
[ScheduleEnable],
[ScheduleFreqType],
[ScheduleFreqInterval],
[ScheduleFreqSubdayType],
[ScheduleFreqSubdayInterval],
[ScheduleFreqRelativeInterval],
[ScheduleFreqRecurrenceFactor],
[ScheduleActiveStartDay],
[ScheduleActiveEndDay],
[ScheduleActiveStartTime],
[ScheduleActiveEndTime],
[VersionDate],
[TimeoutSec])
VALUES (
-- UseSetting - признак использования настройки.
-- Если выключена, то задания по ней не будут создаваться
-- или обновляться.
1,
-- Enable - задание включено. Если выключено, то задания будут созданы,
-- но в выключенном состоянии.
1,
-- ApplyTemplateQuery - шаблон запроса для формирования заданий в разрезе баз данных.
-- В этом случае не используется, т.к. задания создаются для сервера в единственном экземпляре.
NULL,
-- Name - имя задания.
N'SQLServerMaintenance.ControlTransactionLogUsage',
-- Description - описание задания.
N'Контроль заполнения лога транзакций',
-- JobAction - действие задания. В данном случае используется простое текстовое описание в виде скрипта.
-- Примечание: если нужно создать задание с несколькими шагами, то есть вариант описания шагов с помощью XML. Этот вариант будет описан в другом примере.
N'EXECUTE [SQLServerMaintenance].[dbo].[sp_ControlTransactionLogUsage] ',
-- [Задание расписание запуска] <<
-- Эти поля содержат настройки для задания расписания запуска.
-- Подробнее можно узнать в официальной документации:
-- https://learn.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-add-schedule-transact-sql?view=sql-server-ver16
-- Ниже приведено краткое описание.
-- Также для удобства можно задать расписание у задания через SSMS, а значения параметров получить через формирование скрипта CREATE.
-- [Задание расписание запуска] <<
-- ScheduleEnable - расписание используется.
1,
-- ScheduleFreqType - тип частоты выполнения задания. Например, 4 - это ежедневно, 8 - еженедельно, 16 - ежемесячно, 1 - разовое выполнение.
4,
-- ScheduleFreqInterval - дни, в течении которых выполняется задание. Например, 4 - ежедневно, 8 ежемесячно, 1 - не используется и т.д.
1,
-- ScheduleFreqSubdayType - определяет единицу измерения для параметра ScheduleFreqInterval. Например, 2 - секунды, 4 - минуты, 8 - часы.
4,
-- ScheduleFreqSubdayInterval - количество периодов ScheduleFreqSubdayType, которые должны проходить между кадым выполнением задания.
1,
-- ScheduleFreqRelativeInterval - вызов задания по параметру ScheduleFreqInterval каждый месяц. например, 1 - первый, 2 - второй и др.
0,
-- ScheduleFreqRecurrenceFactor - количество недель или месяцев между запланированным выполнением задания.
0,
-- ScheduleActiveStartDay - дата, с которой можно начать выполнение задания
20000101,
-- ScheduleActiveEndDay - дата, до кторой можно выполнять задание.
99991231,
-- ScheduleActiveStartTime -- время, с которого можно начать выполнение задания.
0,
-- ScheduleActiveEndTime - время, до которого можно начать выполнение задания.
235959,
-- [Задание расписание запуска] <<
-- VersionDate - дата версии. При изменении данных в таблице заполняется автоматически. Используется для определения необходимости обновления настроек существующих задания.
CAST(N'2023-10-30T13:53:19.033' AS DateTime),
-- TimeoutSec - время в секундах, которое задание может работать. При превышении таймаута задание может быть принудительно завершено.
0
)
Таким образом, по этой настройке будет создано задание SQLServerMaintenance.ControlTransactionLogUsage с выполнением скрипта:
EXECUTE [SQLServerMaintenance].[dbo].[sp_ControlTransactionLogUsage]
А также запуском раз в минуту.
Более сложный пример это создание заданийв разрезе баз данных, да еще и с несколькими шагами. Например, для заданий обслуживания.
В этом случае настройка будет такой:
INSERT [dbo].[JobTemplates] (
[UseSetting],
[Enable],
[ApplyTemplateQuery],
[Name],
[Description],
[JobAction],
[ScheduleEnable],
[ScheduleFreqType],
[ScheduleFreqInterval],
[ScheduleFreqSubdayType],
[ScheduleFreqSubdayInterval],
[ScheduleFreqRelativeInterval],
[ScheduleFreqRecurrenceFactor],
[ScheduleActiveStartDay],
[ScheduleActiveEndDay],
[ScheduleActiveStartTime],
[ScheduleActiveEndTime],
[VersionDate],
[TimeoutSec])
VALUES (
-- UseSetting - признак использования настройки.
-- Если выключена, то задания по ней не будут создаваться
-- или обновляться.
1,
-- Enable - задание включено. Если выключено, то задания будут созданы,
-- но в выключенном состоянии.
-- В этом примере задания создаются, но в выключенные.
0,
-- ApplyTemplateQuery - шаблон запроса для формирования заданий в разрезе баз данных.
-- В этом случае задан запрос с обязательным полем "DatabaseName",
-- который возвращет все базы на сервере, кроме системных.
N'SELECT
[name] AS [DatabaseName]
FROM sys.databases
WHERE NOT [name] IN (''master'', ''msdb'', ''model'', ''tempdb'')',
-- Name - имя задания.
-- В имени используется шаблон замены '{DatabaseName}',
-- чтобы имя задания изменялось под базу данных.
N'SQLServerMaintenance.FullMaintenance_{DatabaseName}',
-- Description - описание задания.
-- В имени используется шаблон замены '{DatabaseName}',
-- чтобы имя задания изменялось под базу данных.
N'Полное обслуживание базы данных {DatabaseName}',
-- JobAction - действие задания. В данном примере используется описание шагов.
-- Описание делается в виде XML, где в главном элементе "steps" задается для каждого шага элемент "step с полями:
-- > Name - имя шага
-- > Script - TSQL скрипт для запуске на шаге.
N'<steps>
<step>
<name>Index Maintenance</name>
<script>
EXECUTE [SQLServerMaintenance].[dbo].[sp_IndexMaintenance]
@databaseName = ''{DatabaseName}''
</script>
</step>
<step>
<name>Statistic Maintenance</name>
<script>
EXECUTE [SQLServerMaintenance].[dbo].[sp_StatisticMaintenance]
@databaseName = ''{DatabaseName}''
</script>
</step>
</steps>',
-- [Задание расписание запуска] <<
-- Эти поля содержат настройки для задания расписания запуска.
-- Подробнее можно узнать в официальной документации:
-- https://learn.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-add-schedule-transact-sql?view=sql-server-ver16
-- Ниже приведено краткое описание.
-- Также для удобства можно задать расписание у задания через SSMS, а значения параметров получить через формирование скрипта CREATE.
-- [Задание расписание запуска] <<
-- ScheduleEnable - расписание используется.
1,
-- ScheduleFreqType - тип частоты выполнения задания. Например, 4 - это ежедневно, 8 - еженедельно, 16 - ежемесячно, 1 - разовое выполнение.
4,
-- ScheduleFreqInterval - дни, в течении которых выполняется задание. Например, 4 - ежедневно, 8 ежемесячно, 1 - не используется и т.д.
1,
-- ScheduleFreqSubdayType - определяет единицу измерения для параметра ScheduleFreqInterval. Например, 2 - секунды, 4 - минуты, 8 - часы.
1,
-- ScheduleFreqSubdayInterval - количество периодов ScheduleFreqSubdayType, которые должны проходить между кадым выполнением задания.
60,
-- ScheduleFreqRelativeInterval - вызов задания по параметру ScheduleFreqInterval каждый месяц. например, 1 - первый, 2 - второй и др.
0,
-- ScheduleFreqRecurrenceFactor - количество недель или месяцев между запланированным выполнением задания.
0,
-- ScheduleActiveStartDay - дата, с которой можно начать выполнение задания
20231021,
-- ScheduleActiveEndDay - дата, до кторой можно выполнять задание.
99991231,
-- ScheduleActiveStartTime -- время, с которого можно начать выполнение задания.
200000,
-- ScheduleActiveEndTime - время, до которого можно начать выполнение задания.
235959,
-- [Задание расписание запуска] <<
-- VersionDate - дата версии. При изменении данных в таблице заполняется автоматически. Используется для определения необходимости обновления настроек существующих задания.
CAST(N'2023-10-30T13:53:19.033' AS DateTime),
-- TimeoutSec - время в секундах, которое задание может работать. При превышении таймаута задание может быть принудительно завершено.
-- В данном примере это 3 часа.
10800
)
Данная настройка для каждой базы на сервере (кроме системных) создает задание вида "SQLServerMaintenance.FullMaintenance_<ИмяБазы>" с двумя шагами:
* Index Maintenance - обслуживание индексов.
* Statistic Maintenance - обслуживание статистики.
Запуск задания выполняется в 20:00 по времени сервера ежедневно. При этом изначально задание создается выключенным.
Шаги задания задаются в виде XML:
<steps>
<step>
<name>Index Maintenance</name>
<script>
EXECUTE [SQLServerMaintenance].[dbo].[sp_IndexMaintenance]
@databaseName = '{DatabaseName}'
</script>
</step>
<step>
<name>Statistic Maintenance</name>
<script>
EXECUTE [SQLServerMaintenance].[dbo].[sp_StatisticMaintenance]
@databaseName = '{DatabaseName}'
</script>
</step>
</steps>
В главном элементе "steps" задается для каждого шага элемент "step с полями:
- Name - имя шага
- Script - TSQL скрипт для запуске на шаге.
Таким образом, можно автоматизировать настройку базового обслуживания для новых и старых баз. А особые обслуживания можно настраивать по доп. условиям в новых настройках.
Для того, чтобы создать / обновить задания по добавленным настройкам нужно вызывать процедуру sp_CreateOrUpdateJobsBySettings.
EXECUTE [dbo].[sp_CreateOrUpdateJobsBySettings]
В целом, ее запуск также можно настроить в задании раз в день или чаще, в зависимости от требований.
По умолчанию задания создаются, если их нет и обновляются при наличии шаблона новой версии. Но можно принудительно обновить задания по текущим шаблонам:
EXECUTE [dbo].[sp_CreateOrUpdateJobsBySettings]
@force = 1
Может понадобиться для восстановления изначального вида уже созданных заданий.
Выше в шаблоне задавались настройки таймаута для заданий. Но для конкретных заданий таумаут выполнения задается в таблице JobTimeouts, в виде:
- JobName - имя задания.
- TimeoutSec - таймаут выполнения в секундах.
Для контроля выполнения используется задание SQLServerMaintenance.ControlJobsExecutionTimeout, которое создается автоматически из шаблонов (см. выше). Также контроль можно выполнять вручную, запуская процедуру:
EXECUTE [SQLServerMaintenance].[dbo].[sp_ControlJobsExecutionTimeout]
Если время выполнения задания превышает установленное значение, то соединение с базой данных этого задания будет принудительно завершено.
Для упрощения создания заданий добавлена процедура sp_CreateSimpleJob со следующими параметрами:
- jobName - наименование задания.
- jobDescription - описание задания.
- jobEnabled - флаг для создания задания включеным (по умолчанию 1).
- databaseName - имя базы данных, в контексте которой будет выполняться задание.
- jobAction - описание действия, которое выполняет задание. Два варианта:
- TSQL-скрипт.
- XML с описанием шагов (см. выше.
- scheduleEnabled - признак включенного расписания.
- scheduleFreqType - тип частоты выполнения задания. Например, 4 - это ежедневно, 8 - еженедельно, 16 - ежемесячно, 1 - разовое выполнение.
- scheduleFreqInterval - дни, в течении которых выполняется задание. Например, 4 - ежедневно, 8 ежемесячно, 1 - не используется и т.д.
- scheduleFreqSubdayType - определяет единицу измерения для параметра ScheduleFreqInterval. Например, 2 - секунды, 4 - минуты, 8 - часы.
- scheduleFreqSubdayInterval - количество периодов ScheduleFreqSubdayType, которые должны проходить между кадым выполнением задания.
- scheduleFreqRelativeInterval - вызов задания по параметру ScheduleFreqInterval каждый месяц. например, 1 - первый, 2 - второй и др.
- scheduleFreqRecurrenceFactor - количество недель или месяцев между запланированным выполнением задания.
- scheduleActiveStartDate - дата, с которой можно начать выполнение задания.
- scheduleActiveEndDate - дата, с которой можно начать выполнение задания
- scheduleActiveStartTime - время, с которого можно начать выполнение задания.
- scheduleActiveEndTime - время, до которого можно начать выполнение задания.
- jobTimeoutSec - таймат выполнения задания в секундах. По умолчанию выключен.
По факту является оберткой над вызовом нескольких системных процедур и просто облегчает работу с ними.