Восстановление системных баз данных msdb и model в SQL Server
Сбои системных баз msdb и model приводят к тяжелым функциональным нарушениям инфраструктуры СУБД:
- Сбой msdb: Служба
SQL Server Agentне запускается, планы обслуживания (Maintenance Plans) и регламентные джобы бэкапов перестают выполняться, теряется история резервного копирования; - Сбой model: Невозможно создать новую базу данных, а служба SQL Server не может стартовать, так как база
tempdbсоздается при каждом перезапуске как копия базы model.
1. Процедура восстановления базы msdb
База msdb используется Агентом SQL Server, Database Mail и Service Broker. Перед ее восстановлением необходимо остановить зависимые службы:
-- 1. Остановка Агента SQL Server
net stop SQLSERVERAGENT
-- 2. Перевод msdb в монопольный режим и восстановление
USE [master];
GO
ALTER DATABASE [msdb] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
RESTORE DATABASE [msdb]
FROM DISK = N'E:\Backup\System\msdb_Full.bak'
WITH REPLACE, RECOVERY;
GO
ALTER DATABASE [msdb] SET MULTI_USER;
GO
-- 3. Запуск Агента
net start SQLSERVERAGENT2. Процедура восстановления базы model
База model является шаблоном для создания всех новых баз и базы tempdb.
USE [master];
GO
ALTER DATABASE [model] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
RESTORE DATABASE [model]
FROM DISK = N'E:\Backup\System\model_Full.bak'
WITH REPLACE, RECOVERY;
GO
ALTER DATABASE [model] SET MULTI_USER;
GO3. Восстановление msdb из шаблонов дистрибутива (если бэкапов нет)
Если бэкап msdb отсутствует, скопируйте оригинальные чистые файлы шаблонов из установочного каталога:
-- Скопируйте файлы msdbdata.mdf и msdblog.ldf из каталога:
-- C:\Program Files\Microsoft SQL Server\MSSQLXX.MSSQLSERVER\MSSQL\Binn\Templates\
-- в рабочий каталог данных DATA, предварительно остановив службу SQL Server. Частые вопросы (FAQ)
Почему при падении базы model не запускается весь SQL Server?
При каждом старте экземпляра движок СУБД пересоздает временную системную базу tempdb с нуля, копируя структуру, параметры и размерные характеристики из базы model. Если model повреждена, tempdb не может быть инициализирована, и сервер падает.
Можно ли перевести базу msdb в модель восстановления FULL?
Да, но это не рекомендуется, если вы не делаете регулярный бэкап логов msdb. Таблицы истории джобов и резервного копирования быстро переполнят журнал транзакций msdb.ldf.
Теряются ли настроенные планы обслуживания (Maintenance Plans) при восстановлении msdb из старого бэкапа?
Да, все SSIS-пакеты планов обслуживания и расписания SQL Agent хранятся внутри msdb. Они вернутся к состоянию на момент создания бэкапа.
Как очистить разросшуюся историю выполнения заданий в msdb?
Используйте системную хранимую процедуру: EXEC msdb.dbo.sp_purge_jobhistory @oldest_date = '2024-01-01'.