Ситуация, когда после внезапного отключения электроэнергии сервер MS SQL перестает видеть базы данных, а при попытке входа выдает ошибку «Не удается открыть базу данных msdb», является критической для любого предприятия. Особенно остро это ощущается в среде 1С, где простой базы данных парализует работу всей организации. В этой статье мы подробно разберем, почему это происходит и как восстановить работоспособность сервера, если системные базы данных оказались повреждены.
Для понимания процесса восстановления важно проанализировать, как MS SQL Server хранит информацию о структуре данных. Основная информация о сервере находится в системных базах:
Если в момент записи данных происходит скачок напряжения или аварийное выключение, файловая система может не успеть закрыть транзакцию, что приводит к логической порче файлов .mdf. Если повреждена база master, SQL Server просто «забывает», какие базы в нем были зарегистрированы. Если повреждена msdb, служба сервера может вовсе не запуститься или работать некорректно, не отображая список доступных БД.
Прежде чем приступать к активным действиям, проанализируем текущее состояние файлов. Первым делом необходимо остановить службу SQL Server (если она еще работает) и физически скопировать все файлы баз данных 1С (файлы с расширениями .mdf и .ldf) в безопасное место. Даже если системные базы погибли, ваши данные 1С, скорее всего, целы, и их можно будет «прицепить» к новому серверу.
Рассмотрим стандартный путь хранения системных баз (он может отличаться в зависимости от версии):
D:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA
Убедитесь, что вы скопировали файлы 1С-овских баз. Только после создания физической копии файлов можно переходить к восстановлению системных баз.
Если у вас есть актуальные бэкапы системных баз, мы можем воспользоваться скриптом восстановления. Разберем пример восстановления msdb из файла резервной копии:
RESTORE DATABASE [msdb]
FROM DISK = N'D:\Backup\SYS\msdb.bak'
WITH FILE = 1,
MOVE N'MSDBData' TO N'D:\SQLData\msdbdata.mdf',
MOVE N'MSDBLog' TO N'D:\SQLData\msdblog.ldf',
NOUNLOAD, REPLACE
GO
Однако на практике бэкапы системных баз делают редко. В этом случае рассмотрим альтернативные варианты.
Если база msdb повреждена и не дает запустить сервер, можно попробовать подменить ее чистыми файлами с другого сервера той же версии. Внимание: крайне важно соблюдать идентичность версии (Build Number) и разрядности (x86 или x64). Если подставить файлы от другой версии, система может уйти в синий экран (BSOD) с ошибкой REGISTRY_ERROR.
msdbdata.mdf и msdblog.ldf.После этого сервер должен успешно стартовать. Учтите, что при такой подмене пропадет история старых бэкапов и все настроенные задания в SQL Agent — их придется пересоздать вручную.
Если подмена не помогла, проанализируем штатный механизм восстановления — перестроение баз через утилиту установки. Это создаст абсолютно чистые системные базы master, model и msdb.
Для выполнения этой операции используем командную строку (запущенную от имени администратора) и дистрибутив SQL Server:
setup.exe /ACTION=REBUILDDATABASE /INSTANCENAME=MSSQLSERVER /SQLSYSADMINACCOUNTS=ВашДомен\Администратор
После завершения процесса сервер станет «как новый». В списке баз не будет ни одной вашей базы 1С. Не пугайтесь — файлы на диске остались, нам просто нужно их заново зарегистрировать.
Теперь, когда SQL Server запущен и работает, нам нужно вернуть базы 1С в строй. Для этого используем механизм Attach. Разберем, как это сделать правильно через T-SQL, чтобы избежать проблем с правами:
CREATE DATABASE [Имя_Базы_1С]
ON (FILENAME = 'D:\SQLData\Base1C.mdf'),
(FILENAME = 'D:\SQLData\Base1C_log.ldf')
FOR ATTACH;
Повторите эту процедуру для каждой вашей базы. Если при подключении возникает ошибка доступа, проверьте права на папки — у пользователя, под которым запущена служба SQL Server, должны быть полные права на файлы .mdf и .ldf.
После пересоздания базы master или переустановки SQL Server, SID (уникальные идентификаторы) пользователей в системной базе и в базе 1С перестанут совпадать. 1С выдаст ошибку авторизации. Выясним, как это лечится.
Рассмотрим процедуру сопоставления пользователя базы данных с логином сервера:
USE [Имя_Базы_1С];
GO
EXEC sp_change_users_login 'Update_One', 'Имя_Пользователя_1С', 'Имя_Логина_SQL';
GO
Это восстановит связь, и пользователи смогут заходить в 1С под своими привычными учетными записями.
Проанализировав ситуацию с BSOD при запуске SQL, стоит отметить, что причина может крыться в повреждении файловой системы. Обязательно выполните проверку диска:
chkdsk D: /f /r
Это позволит исключить наличие битых секторов на диске, где лежат базы данных. Если SQL Server при старте пытается прочитать данные из сбойного сектора, это может приводить к краху всей операционной системы.
Заключение: Чтобы в будущем не тратить всю ночь на восстановление, крайне рекомендуем обеспечить сервер источником бесперебойного питания (ИБП) с функцией корректного завершения работы ОС, а также настроить ежедневное резервное копирование не только пользовательских баз 1С, но и системной базы master. Это позволит вернуть сервер в строй за считанные минуты.