Ошибки при запуске службы SQL Server (MSSQLSERVER) часто становятся критической проблемой для работы всей инфраструктуры 1С. Одной из наиболее неприятных ситуаций является возникновение ошибки 1814, особенно после аварийного отключения питания или некорректного завершения работы сервера. В этой статье мы подробно разберем, почему возникает эта ошибка, как проанализировать логи сервера и какие шаги предпринять для восстановления работоспособности базы данных.
Для начала разберем природу ошибки. Код 1814 в контексте SQL Server буквально означает, что серверу не удалось создать базу данных tempdb. Поскольку tempdb создается заново при каждом запуске службы, любая преграда на этом пути останавливает весь процесс старта сервера.
Проанализируем типичный лог-файл (ERRORLOG), который можно найти в папке C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Log\ (путь может отличаться в зависимости от версии и инстанса). В логах мы часто видим следующую последовательность:
Важно понимать: несмотря на сообщение о нехватке места, проблема чаще всего кроется именно в базе model. База model является шаблоном для всех новых баз данных, включая tempdb. Если model находится в состоянии RESTORING (Восстановление), SQL Server не может использовать её как шаблон, не может создать tempdb и, как следствие, выдает ошибку 1814.
Рассмотрим ситуацию, когда это происходит. Чаще всего причиной является человеческий фактор или ошибки в скриптах обслуживания. Если кто-то (или автоматический бэкап) попытался сделать резервную копию системной базы с параметром WITH NORECOVERY, база переходит в состояние ожидания последующих логов транзакций и становится недоступной для чтения. После перезапуска службы SQL Server обнаруживает, что шаблон поврежден или "не до конца восстановлен", и прекращает работу.
Поскольку служба SQL Server не запускается в обычном режиме, мы не можем просто подключиться через SQL Server Management Studio (SSMS) и выполнить команду восстановления. Разберем по шагам, как это обойти:
NET STOP MSSQLSERVER.
sqlservr.exe -sMSSQLSERVER -f -T3608
Здесь параметр -f запускает сервер в режиме минимальной конфигурации, а -T3608 запрещает SQL Server открывать любые базы данных, кроме основной системной базы master.sqlcmd:
sqlcmd -S .\MSSQLSERVER
RESTORE DATABASE model WITH RECOVERY;
GO
sqlservr.exe и запустим службу в штатном режиме через консоль "Службы" или командой NET START MSSQLSERVER.Если база model была физически повреждена (например, из-за сбоя файловой системы), процедура RECOVERY может не помочь. В этом случае проанализируем возможность использования "чистых" шаблонов, которые поставляются вместе с дистрибутивом SQL Server.
Рассмотрим, где искать эти файлы. В версии SQL Server 2008 R2 (как в примере) они обычно находятся по пути:
C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Binn\Templates.
Выполним следующие действия:
...\MSSQL\DATA\).model.mdf и modellog.ldf. Переименуем их в model.mdf.old и modellog.ldf.old (это важно для возможности отката).model.mdf и modellog.ldf из папки Templates в папку DATA.Внимание: При использовании этого метода все настройки, которые вы могли вносить в базу model (например, пользовательские типы данных или хранимые процедуры, которые должны появляться во всех новых базах), будут сброшены к заводским настройкам.
Иногда ошибка 1814 действительно связана с правами доступа или местом на диске, как и пишет SQL Server в логах. Разберем ситуацию глубже. Даже если Windows показывает, что на диске C или D свободно 100 Гб, SQL Server может столкнуться с ограничениями:
NT Service\MSSQLSERVER или локальный системный аккаунт).DATA и убедимся, что этот флаг снят.Если ни один из вышеперечисленных методов не помог, рассмотрим самый радикальный вариант — Rebuild System Databases. Это фактически переустановка системных компонентов без удаления пользовательских данных.
Для выполнения этой операции нам понадобится установочный дистрибутив вашей версии SQL Server. Разберем пример команды запуска пересборки:
setup.exe /QUIET /ACTION=REBUILDDATABASE /INSTANCENAME=MSSQLSERVER /SQLSYSADMINACCOUNTS=Администратор /SAPWD=ВашПароль
Важные замечания по этому методу:
Поэтому к этому методу стоит прибегать только в самом крайнем случае, имея бэкапы или четкий план восстановления метаданных сервера.
Мы проанализировали ситуацию с ошибкой 1814 и выяснили, что основной виновник — невозможность инициализации базы tempdb из-за проблем с шаблоном model. В большинстве случаев достаточно принудительно вывести model из состояния восстановления или заменить её файлы из папки шаблонов. Всегда начинайте с анализа лог-файла ERRORLOG, так как именно он дает точный ответ на вопрос, почему сервер отказался запускаться.