MS SQL Server: Настройка задачи Очистка журнала и размер msdb
Симптомы неконтролируемого роста базы msdb
Системная база данных msdb разрастается до сотен гигабайт, переполняя системный диск. Создание бэкапов баз 1С начинает выполняться медленно, регламентные задания SQL Server Agent зависают, а запросы к системным представлениям резервного копирования вызывают тайм-ауты.
| Таблица в msdb | Хранимые данные | Причина разрастания |
|---|---|---|
| dbo.backupset | Сведения о каждом выполненном бэкапе | Отсутствие регламентной очистки истории резервного копирования |
| dbo.backupfile | Сведения о файлах данных внутри каждого бэкапа | Ежечасные бэкапы транзакционных логов сотен баз 1С |
| dbo.sysjobhistory | Логи выполнения шагов агента SQL Server | Не настроен лимит строк журнала заданий (Job History limit) |
Регламент обслуживания и очистки базы данных msdb
- Удаление старой истории бэкапов через системную хранимую процедуру: удалите исторические записи старше 30 или 60 дней:
USE msdb; GO DECLARE @OldestDate DATETIME = DATEADD(dd, -60, GETDATE()); EXEC sp_delete_backuphistory @oldest_date = @OldestDate; GO - Очистка истории заданий SQL Agent и цепочек обслуживания:
USE msdb; GO DECLARE @CleanupDate DATETIME = DATEADD(dd, -30, GETDATE()); EXEC sp_purge_jobhistory @oldest_date = @CleanupDate; EXEC sp_maintplan_delete_log @oldest_time = @CleanupDate; GO - Ограничение глубины хранения логов в свойствах SQL Agent: откройте SQL Server Agent > Свойства > Журнал (History):
- Установите флаг Ограничить размер журнала журнала заданий.
- Максимальный размер журнала в строках:
10000. - Максимум строк журнала на одно задание:
1000.
- Сжатие файла данных msdb после массовой чистки (Shrink):
USE msdb; GO CHECKPOINT; DBCC SHRINKFILE (MSDBData, 1024); -- Сжатие до 1 ГБ GO
Важно: Процедура sp_delete_backuphistory на запущенных базах с миллионами записей может выполняться много часов и блокировать таблицы. При первичном запуске удаляйте историю итеративно (по 3-5 дней за шаг).
Частые вопросы (FAQ)
Повредит ли очистка backuphistory возможность восстановления текущих бэкапов?
Нет. Физические файлы резервных копий .bak и .trn не затрагиваются, удаляются только метаданные об операциях из системного журнала MS SQL Server.
Почему регулярный Maintenance Plan 'History Cleanup' зависает?
Если очистка не проводилась годами, план обслуживания пытается выполнить удаление всего объема в рамках одной гигантской транзакции, вызывая рост лога транзакций msdblog.ldf.
Как предотвратить постоянный рост msdb в будущем?
Создайте еженедельное задание SQL Agent с вызовом sp_delete_backuphistory с параметром DATEADD(day, -30, GETDATE()).
Нужно ли перестраивать индексы в msdb после чистки?
Да, после удаления миллионов записей индексы системных таблиц сильно фрагментированы, рекомендуется выполнить команду: ALTER INDEX ALL ON dbo.backupset REBUILD.