Что делать, если не удается открыть базу данных msdb в MS SQL Server и возникает ошибка 945

Системный администратор IT и автоматизация бизнеса
← На главную

В процессе эксплуатации 1С:Предприятия на платформе MS SQL Server системные администраторы могут столкнуться с критической ситуацией, когда экземпляр SQL Server запускается, но одна из важнейших системных баз данных — msdb — переходит в состояние Recovery Pending или Suspect. Это сопровождается ошибкой 945: "Не удалось открыть базу данных msdb вследствие недоступности файлов, нехватки памяти или места на диске".

Проблема осложняется тем, что база msdb отвечает за работу SQL Server Agent, хранение планов обслуживания, заданий (jobs), истории резервного копирования и работу почтового профиля (Database Mail). Без этой базы невозможно автоматизировать обслуживание 1С. Разберем подробно, почему это происходит и как восстановить работоспособность сервера.

Анализируем причину возникновения ошибки

Прежде всего, проанализируем сообщения из журнала ошибок (Error Log) SQL Server. Типичная картина выглядит так: система фиксирует ошибку логической целостности ввода-вывода (logical consistency-based I/O error). В логах это отображается следующим образом:

SQL Server detected a logical consistency-based I/O error: неправильная контрольная сумма... It occurred during a прочитать of page (2:0) in database ID 4 at offset 0000000000000000 in file '...MSDBLog.ldf'

Выясним причину этой записи. База данных с database ID 4 — это всегда msdb. Ошибка контрольной суммы (checksum error) означает, что данные, записанные на диск, при чтении не соответствуют тому значению, которое было рассчитано при записи. Рассмотрим основные факторы, приводящие к этому:

  1. Сбои дисковой подсистемы: Появление "битых" секторов на жестком диске или ошибки контроллера RAID.
  2. Проблемы с файловой системой: Логические ошибки NTFS, требующие проверки утилитой chkdsk.
  3. Некорректное завершение работы: Выключение сервера "по питанию", при котором кэш записи не успел сбросить данные на диск.
  4. Вмешательство антивирусов: Блокировка или повреждение заголовков файлов .mdf или .ldf при сканировании.

Метод 1: Попытка восстановления через EMERGENCY и DBCC CHECKDB

Если база данных недоступна, мы не можем просто выполнить ALTER DATABASE. Рассмотрим алгоритм действий, когда база повреждена, но мы пытаемся сохранить данные (например, сложные задания SQL Agent).

Попробуем перевести базу в режим EMERGENCY. В этом режиме база становится доступной только для чтения администраторам и позволяет выполнить проверку. Выполним следующий скрипт в среде Management Studio (SSMS):


USE [master];
GO
-- Переводим базу в аварийный режим
ALTER DATABASE [msdb] SET EMERGENCY;
GO
-- Устанавливаем монопольный доступ
ALTER DATABASE [msdb] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
-- Запускаем проверку с попыткой восстановления
DBCC CHECKDB ('msdb', REPAIR_ALLOW_DATA_LOSS) WITH NO_INFOMSGS, ALL_ERRORMSGS;
GO
-- Возвращаем многопользовательский режим
ALTER DATABASE [msdb] SET MULTI_USER;
GO

Важный момент: Использование параметра REPAIR_ALLOW_DATA_LOSS является крайней мерой, так как это может привести к удалению части данных для восстановления структурной целостности. Однако для msdb это часто единственный способ "поднять" базу без полной потери настроек.

Метод 2: Использование чистых шаблонов (Templates)

Если DBCC CHECKDB выдает ошибку 945 и не может открыть базу даже в режиме EMERGENCY, или если база лога MSDBLog.ldf повреждена безвозвратно, мы можем воспользоваться механизмом шаблонов. При установке SQL Server копирует "чистые" файлы системных баз в специальную папку.

Разберем этот процесс по шагам:

  1. Остановим службу SQL Server через SQL Server Configuration Manager или оснастку services.msc.
  2. Перейдем в папку с установленным экземпляром. Обычно путь выглядит так: C:\Program Files\Microsoft SQL Server\MSSQLXX.INSTANCE\MSSQL\Binn\Templates (где XX — версия SQL Server, например, 10_50 для SQL 2008 R2 или 15 для SQL 2019).
  3. Найдем файлы msdbdata.mdf и msdblog.ldf.
  4. Скопируем их в рабочую папку DATA вашего экземпляра, предварительно переименовав или переместив старые поврежденные файлы в архив.
  5. Запустим службу SQL Server.

Проанализируем последствия: после этого база msdb станет абсолютно чистой. Вы потеряете историю бэкапов 1С, все настроенные Job-ы (выгрузки, переиндексации) и историю почты. Вам придется заново создать планы обслуживания или восстановить их из скриптов, если вы их сохраняли ранее.

Метод 3: Восстановление с флагом трассировки 3608

Иногда сервер не дает манипулировать базой msdb, так как она критически важна для запуска. Посмотрим, как запустить экземпляр в ограниченном режиме. Флаг трассировки 3608 предотвращает автоматическое восстановление и запуск любой базы данных, кроме master.

  1. Запустим командную строку (cmd) от имени администратора.
  2. Запустим SQL Server вручную: sqlservr.exe -c -T3608 (возможно, потребуется указать полный путь к файлу sqlservr.exe).
  3. Теперь база msdb не занята процессом восстановления. Мы можем попробовать выполнить операцию DETACH, удалить поврежденный ldf и попробовать сделать ATTACH с пересозданием лога, либо просто подменить файлы, как описано в методе выше.

Метод 4: Полное пересоздание системных баз (Rebuild Database)

В самых тяжелых случаях, когда повреждены несколько системных баз или замена файлов не помогает, мы используем штатную утилиту установки SQL Server для полной пересборки. Рассмотрим этот вариант.

Нам понадобится дистрибутив (установочный диск или ISO) той же версии, что установлена на сервере. Выполним команду в консоли:


Setup.exe /QUIET /ACTION=REBUILDDATABASE /INSTANCENAME=MSSQLSERVER /SQLSYSADMINACCOUNTS=Администратор /SAPWD=ВашПароль

Параметры команды:

Внимание: Этот метод полностью обнуляет все системные настройки сервера, включая логины (logins), привязки пользователей 1С к базе и настройки безопасности.

Проверка состояния оборудования

Поскольку ошибка контрольной суммы (Checksum error) почти всегда связана с физическими проблемами, проанализируем состояние "железа". Недостаточно просто починить базу данных, нужно предотвратить повторение ситуации.

Рекомендуем выполнить следующие действия:

Резюме и рекомендации

Подведем итоги. Если вы столкнулись с ошибкой 945 и повреждением контрольной суммы в msdb, наиболее эффективным и быстрым способом восстановления для системного администратора 1С является подмена файлов базы данными из папки Templates. Это позволяет запустить сервер немедленно, хотя и требует последующего пересоздания регламентных заданий.

Чтобы избежать подобных проблем в будущем, обязательно настройте регулярное резервное копирование не только пользовательских баз 1С, но и системных баз данных (master, msdb, model). Также убедитесь, что файлы баз данных исключены из сканирования антивирусом в режиме реального времени.

← На главную