Настройка планов обслуживания (Maintenance Plans) для бэкапов в MSSQL
Ошибки и проблемы при использовании встроенных графических планов обслуживания (Maintenance Plans):
- Задание Maintenance Cleanup Task не удаляет старые файлы архивов, что приводит к переполнению диска;
- Конфликты времени выполнения: тяжелая переиндексация совпадает по расписанию с бэкапом, блокируя работу 1С;
- Сбои выполнения планов без информативных сообщений об ошибках в журнале SQL Agent.
1. Архитектура надежного плана обслуживания для 1С:Предприятие
Рекомендуемый регламент разделения задач обслуживания на независимые субпланы (Subplans):
- Subplan 1 (Full Backup): Ежедневно в 02:00 (Check Database Integrity -> Backup Full -> Cleanup History -> Maintenance Cleanup);
- Subplan 2 (Diff Backup): Каждые 4 часа в рабочее время (Backup Diff);
- Subplan 3 (Log Backup): Каждые 10-15 минут круглосуточно (Backup Log);
- Subplan 4 (Index Maintenance): Выходные дни (Reorganize / Rebuild Index -> Update Statistics).
2. Настройка задачи очистки старых бэкапов (Maintenance Cleanup Task)
Главная причина, почему Cleanup Task не удаляет файлы — некорректный синтаксис расширения:
- В поле 'File extension' указывайте расширение без точки: пишите
bakилиtrn(а не.bak); - Убедитесь, что включен чекбокс 'Search subfolders' при наличии вложенных папок баз данных;
- Задайте глубину хранения (например, 7 дней или 2 недели).
3. Альтернатива: T-SQL скрипт удаления старых бэкапов
Используйте прямую системную процедуру очистки, если графический Cleanup Task работает нестабильно:
-- Удаление файлов бэкапов старше 7 дней (168 часов)
DECLARE @DeleteDate DATETIME = DATEADD(hh, -168, GETDATE());
EXECUTE master.dbo.xp_delete_file
0, -- 0 = файлы бэкапа, 1 = файлы отчетов
N'E:\Backup\MSSQL\',
N'bak',
@DeleteDate,
1; -- 1 = включая подкаталоги
GO4. Очистка истории в базе msdb
План обслуживания должен содержать задачу History Cleanup Task для предотвращения разрастания msdb:
DECLARE @CleanupDate DATETIME = DATEADD(dd, -30, GETDATE());
EXEC msdb.dbo.sp_delete_backuphistory @oldest_date = @CleanupDate;
EXEC msdb.dbo.sp_purge_jobhistory @oldest_date = @CleanupDate; Частые вопросы (FAQ)
Почему Maintenance Cleanup Task не удаляет файлы с точкой в расширении (.bak)?
Внутренняя логика SSIS-компонента Maintenance Cleanup Task автоматически добавляет точку перед переданной строкой расширения. Если указать '.bak', компонент будет искать файлы с маской '..bak' и пропустит реальные файлы.
Что лучше: встроенные Maintenance Plans или скрипты Олы Халленгрена (Ola Hallengren)?
В профессиональной среде Enterprise-уровня стандартом де-факто является бесплатное решение Олы Халленгрена (SQL Server Maintenance Solution). Оно использует чистый T-SQL, гибко обрабатывает ошибки, поддерживает умную переиндексацию по порогам фрагментации и не зависит от сбоев графического движка SSIS.
Почему задача Check Database Integrity в плане обслуживания замедляет сервер?
Потому что она запускает полный DBCC CHECKDB со всеми логическими проверками. В рабочих планах для баз более 1 ТБ рекомендуется разделять физическую проверку (PHYSICAL_ONLY) в будни и глубокую логическую проверку на выходных.
Где посмотреть детальные логи падения шагов Maintenance Plan?
В SSMS перейдите в Management -> Maintenance Plans -> кликните правой кнопкой на план -> 'View History'. Также проверьте текстовые отчеты в каталоге логирования экземпляра: C:\Program Files\Microsoft SQL Server\MSSQLXX.MSSQLSERVER\MSSQL\Log.