3.6. Планировщик работ MS Sql Server

Работы сами по себе слишком мало значат. Это всего лишь набор команд с возможностью построения логики, но пока что мы умеем выполнять работы вручную, а это идентично простому сценарию на языке Transact-SQL и выполнению его в программе Query Analyzer. Но если мы научимся доверять наши работы планировщику задач, то это уже будет что-то действительно полезное. Это уже невозможно сделать с помощью простого файла сценария.

Создание работ достаточно трудоемкий процесс, но если работа должна и будет выполняться по расписанию, то все затраты на создание самой работы и ее шагов окупятся уменьшением ваших трудозатрат на сопровождение базы данных. Вы сможете тратить свое рабочее время на более полезные задачи или заняться изучением чего-то нового. Хороший администратор это тот, который 99% рабочего времени спит, а остальное время пьет кофе :). Это является признаком того, что все работает, а администратор должен только наблюдать и вмешиваться в работу только в экстренных ситуациях. Штатные проблемы должны решаться автоматически и это можно сделать именно с помощью работ.

Планировщики, как и работы, выполняются сервисом SQL Service Agent, поэтому он должен быть запущен, желательно, чтобы он запускался автоматически после загрузки ОС.

3.6.1. Добавление плана выполнения

Для добавления работы в планировщик, используется процедура sp_add_jobschedule, которая выглядит следующим образом:

sp_add_jobschedule [ @job_id = ] job_id, | [ @job_name = ] 'job_name', 
    [ @name = ] 'name' 
    [ , [ @enabled = ] enabled ] 
    [ , [ @freq_type = ] freq_type ]
    [ , [ @freq_interval = ] freq_interval ] 
    [ , [ @freq_subday_type = ] freq_subday_type ] 
    [ , [ @freq_subday_interval = ] freq_subday_interval ] 
    [ , [ @freq_relative_interval = ] freq_relative_interval ] 
    [ , [ @freq_recurrence_factor = ] freq_recurrence_factor ] 
    [ , [ @active_start_date = ] active_start_date ] 
    [ , [ @active_end_date = ] active_end_date ] 
    [ , [ @active_start_time = ] active_start_time ] 
    [ , [ @active_end_time = ] active_end_time ]

Рассмотрим параметры процедуры:

  • @job_id и @job_name – позволяют с помощью идентификатора или имени работы соответственно указать работу, информация, о работе которую необходимо выполнять с помощью планировщика по определенному расписанию;
  • @name – имя для нового планировщика;
  • @enabled – если в этом параметре указать 1, то работа активна и будет выполняться по расписанию. Если 0, то планировщик не активен, то работа не будет выполняться автоматически и запуск будет возможен только вручную.
  • @freq_type – определяет, как часто должна выполняться работа. Здесь можно указывать следующие значения:
    • 1 – однажды;
    • 4 – ежедневно;
    • 8 – еженедельно;
    • 16 – ежемесячно;
    • 32 – ежемесячно, относительно параметра freq interval;
    • 64 – выполнять, после запуска сервиса SQL Service Agent;
    • 128 – выполнять, когда компьютер нагружен минимально.
  • @freq_interval – дни, в которые должна выполняться работа.
  • @freq_subday_type – определяет, что указано в параметре @freq_subday_interval. Здесь может быть одно из следующих значений:
    • 1 – выполнять в указанное время;
    • 4 – в параметре @freq_subday_interval интервал в минутах между запусками работы;
    • 8 – в параметре @freq_subday_interval интервал в часах между запусками.
  • @freq_subday_interval – интервал между запусками работы;
  • @freq_recurrence_factor – количество недель или месяцев между запланированными выполнениями задачи. Этот параметр имеет эффект если @freq_type равен 8, 16 или 32;
  • @active_start_date – начальная дата, с которой работа может начинать выполняться. Дата указывается в виде числа в формате ГГГГММДД;
  • @active_end_date – конечная дата, на которой работа должна закончить выполнение. Дата указывается в виде числа в формате ГГГГММДД;
  • @active_start_time – время начала работы в формате ЧЧММСС;
  • @active_end_time – время конца работы в формате ЧЧММСС.

На первый взгляд, все очень сильно накручено и разработчики немного перемудрили. Но не так страшен черт, как ад, поэтому все встанет на свои места после того, как мы рассмотрим несколько примеров создания планировщика. Но сначала необходимо дать некоторые пояснения параметра @freq_interval.

Смысл значения параметра @freq_interval зависит от @freq_type, поэтому тут требуется дополнительное пояснение:

  • @freq_type равен 4 (ежедневное выполнение). В этом случае значение параметра @freq_interval содержит интервал в днях, через которые нужно выполнять работу.
  • @freq_type равен 8 (еженедельное выполнение). В параметре @freq_interval содержится одно из следующих значений, или их комбинация:
    • 1 – по воскресеньям;
    • 2 – по понедельникам;
    • 4 – по вторникам;
    • 8 – по средам;
    • 16 – по четвергам; Если нужно, чтобы задание выполнялось по средам и четвергам, то необходимо указать число 24 (8+16).
    • 32 – по пятницам;
    • 64 – по субботам.
  • @freq_type равен 16. В параметре @freq_interval содержится день месяца, когда нужно выполнять задание;
  • @freq_type равен 32. В параметре @freq_interval содержится:
    • 1 – в воскресенье;
    • 2 – в понедельник;
    • 3 – во вторник;
    • 4 – в среду;
    • 5 – в четверг;
    • 6 – в пятницу;
    • 7 – в субботу.
    • 8 – каждый день;
    • 9 – в рабочие дни;
    • 10 – в выходные.

В остальных случаях (при @freq_type равному 1, 64 или 128), значение в параметре @freq_interval не используется.

Если в параметре @freq_type указано значение 32, то в параметре @freq_relative_interval указывается в какую неделю нужно выполнять задание. Здесь могут быть следующие значения:

  • 1 – в первую неделю;
  • 2 – во вторую неделю;
  • 4 – в третью неделю;
  • 8 – в четвертую неделю;
  • 16 – в последнюю неделю.

Теперь давайте посмотрим простой пример создания планировщика для нашей тестовой работы:

EXEC sp_add_jobschedule 
   @job_name = 'Тестовая работа 2', 
   @name = 'План выполнения тестовой работы',
   @freq_type = 4,
   @freq_interval = 2,
   @active_start_date = 20050102,
   @active_start_time = 020300,
   @active_end_time = 30300

Параметр @freq_type равен 4, значит, выполнение будет работы происходить с интервалом в дни. Параметр @freq_interval равен 2, а значит выполнение будет происходить каждые два дня. Параметр @active_start_date задает начальную дату 2 января 2005-го года, после которой задание будет активным и работа сможет выполняться.

Время выполнения с 2:03 (параметр @active_start_time). Именно в это время сервис SQL Server Agent запустит работу и она должна закончить выполнение до 3:03 (параметр @active_end_time).

EXEC sp_add_jobschedule 
   @job_name = 'Тестовая работа 2', 
   @name = 'План выполнения тестовой работы',
   @freq_type = 8,
   @freq_interval = 32,
   @freq_recurrence_factor = 2,
   @active_start_time = 020300

Интервал выполнения задан в неделях (параметр @freq_type равен 8) и задание будет выполняться по пятницам (@freq_interval равен 32). Так как параметр @freq_recurrence_factor равен 2, выполнение будет происходить каждые две недели в 2 часа 3 минуты.

Рассмотрим еще один пример:

EXEC sp_add_jobschedule 
   @job_name = 'Тестовая работа 2', 
   @name = 'План выполнения тестовой работы',
   @freq_type = 32,
   @freq_interval = 3,
   @freq_relative_interval = 2,
   @freq_recurrence_factor = 2,
   @active_start_time = 020300

Так как параметр @freq_type равен 32, то значение 3 в параметре @freq_interval указывает на то, что задание будет выполняться по вторникам. Параметр @freq_relative_interval со значением 2 означает, что выполнение будет во вторую неделю. Параметр @freq_recurrence_factor означает выполнение через каждые два месяца.

У одной работы может быть несколько планировщиков, например, один выполняет работу каждый понедельник, а другой планировщик 1-го числа каждого месяца. Одним планировщиком такое реализовать невозможно, а вот с помощью двух, достаточно просто.

3.6.2. Обновление планировщика

Для обновления планировщика используется процедура sp_update_jobschedule, которая выглядит следующим образом:

sp_update_jobschedule [@job_id =] job_id, | 
    [@job_name =] 'job_name',
    [@name =] 'name' 
    [, [@new_name =] 'new_name']
    [, [@enabled =] enabled] 
    [, [@freq_type =] freq_type]
    [, [@freq_interval =] freq_interval]
    [, [@freq_subday_type =] freq_subday_type]
    [, [@freq_subday_interval =] freq_subday_interval]
    [, [@freq_relative_interval =] freq_relative_interval]
    [, [@freq_recurrence_factor =] freq_recurrence_factor]
    [, [@active_start_date =] active_start_date]
    [, [@active_end_date =] active_end_date]
    [, [@active_start_time =] active_start_time]
    [, [@active_end_time =] active_end_time]

С помощью параметров @job_id или @job_name процедура определяет работу, планировщик которой нужно изменить, а с помощью параметра @name задается обновляемый планировщик. Остальные параметры такие же, как и у процедуры создания. Пример использования:

EXEC sp_update_jobschedule 
   @job_name = 'Тестовая работа 2', 
   @name = 'План выполнения тестовой работы',
   @freq_type = 32,
   @freq_interval = 4,
   @freq_relative_interval = 1,
   @freq_recurrence_factor = 3,
   @active_start_time = 043000

3.6.3. Удаление планировщика

Для удаления планировщика используется процедура sp_delete_jobschedule, которой нужно передать в параметре @job_id или @job_name работу, планировщик которой нужно удалить, а с помощью параметра @name задается удаляемый планировщик.

Пример использования:

EXEC sp_delete_jobschedule 
   @job_name = 'Тестовая работа 2', 
   @name = 'План выполнения тестовой работы',

3.6.4. Информация о планировщике

Для получения информации о планировщиках используется процедура EXEC sp_help_jobschedule, которая выглядит следующим образом:

sp_help_jobschedule 
    [ @job_id =] job_id | 
    [ @job_name = ] 'job_name' 
    [ , [ @schedule_name = ] 'schedule_name' ] | 
    [ , [ @schedule_id = ] schedule_id ]

С помощью параметров @job_id или @job_name мы указываем работу, информацию о планировщиках которого мы хотим получить. С помощью параметров @schedule_name или @schedule_id можно указать конкретный планировщик. Если планировщик не указан, а только работа, то будут показаны все планировщики для данной работы.

Предыдущая глава

3.5. SQL Server Agent - Часть 2

Следующая глава

3.7. Предупреждения MS Sql Server

О блоге

Программист, автор нескольких книг серии глазами хакера и просто блогер. Интересуюсь безопасностью, хотя хакером себя не считаю

Обратная связь

Без проблем вступаю в неразборчивые разговоры по e-mail. Стараюсь отвечать на письма всех читателей вне зависимости от страны проживания, вероисповедания, на русском или английском языке.

Пишите мне