Смещение времени начала расписаний заданий агента SQL Server между экземплярами
У меня есть задание агента, позволяющее запускать резервные копии журналов каждые два часа с 2:00 до 23:59 (оставляя окно для запуска полного или дифференциального резервного копирования). Подобная работа создается в каждом из моих примерно 50 экземпляров. Возможно, со временем я добавлю несколько сотен экземпляров (для некоторых наших клиентов мы размещаем SQL-серверы). Все они резервируются на одном и том же диске SAN. Это вызывает проблемы с задержкой и иным образом влияет на производительность.
Я бы хотел сместить время выполнения задания в каждом экземпляре на 5 минут, чтобы экземпляр 1 запускал задание в 2:00, 4:00 и т. Д., Экземпляр 2 запускал его в 2:05, 4:05 и т. д., в третьем экземпляре он будет запущен в 2:10, 4:10 и т. д. и т. д. Если я смещу время начала работы для каждого экземпляра (2:00 для одного экземпляра, 2:05 для второго экземпляра, 2:10 для третьего экземпляра и т. Д.), Могу ли я разумно ожидать, что получу желаемый результат: не все экземпляры запускают работу одновременно?
2 ответа
Если это тот же разговор, который мы только что вели в твиттере: когда вы говорите, что агент SQL Server запускается каждые n минут или каждые n часов, следующий запуск основан на времени начала, а не времени окончания. Таким образом, если вы настроите задание на экземпляре 1 на 2:00 и будете запускать его каждые 2 часа, второй запуск будет выполняться в 4:00, независимо от того, занял ли первый запуск 1 минуту, 12 минут, 45 минут и т. Д.
Есть несколько предостережений:
- могут быть незначительные задержки из-за внутренней синхронизации агента, но я никогда не проводил это более чем на несколько секунд
- если первый запуск в 2:00 занимает более 2 часов (но менее 4 часов), следующий раз, когда выполнение задания будет в 6:00 (прогон 4:00 пропускается, он не выполняется в 4:10 или 4:20 чтобы "догнать")
Было еще одно предложение добавить WAITFOR, чтобы компенсировать время начала (и мы должны отбросить случайный WAITFOR, потому что это, вероятно, не то, что вы хотите - random <> unique). Если вы хотите жестко запрограммировать различную задержку для каждого экземпляра (1 минута, 2 минуты и т. Д.), То гораздо проще сделать это по расписанию, чем путем добавления шагов ко всем своим заданиям. ПО МОЕМУ МНЕНИЮ.
Возможно, вы могли бы настроить централизованную БД, которая управляет "расписанием", и чтобы задания добавляли / обновляли строку при их запуске. Таким образом, каждый последующий сервер может запустить задание, которое "опрашивает", когда оно может начаться. Таким образом, любая задержка в заданиях заставит остальных ждать, поэтому у вас не будет расхождений в времени, когда один из серверов будет сброшен.
Будучи немного параноиком, я бы добавил сценарий "ловушка", который говорит, что после "х" минут ожидания все равно продолжаются, так что задержка не распространяется достаточно далеко, чтобы задания не выполнялись.