Назад | Перейти на главную страницу

SQL Server в состоянии «Ожидание восстановления» после перезагрузки

У нас есть довольно много программ собственной разработки, которые взаимодействуют с нашим SQL Server (SQL Server 2014 Express). Время от времени они начинают взрываться повсюду; мы бегаем вокруг, пытаясь понять, что не так, только чтобы открыть SQL Server Management Studio и обнаружить, что наша база данных не работает.

Чтобы быть более конкретным: мы открываем SSMS, раскрываем узел «Базы данных», и он говорит:
[НАЗВАНИЕ БАЗЫ ДАННЫХ] (ожидается восстановление)

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

После того, как я несколько раз столкнулся с этой проблемой, я заметил, что это происходит только после перезагрузки сервера, хотя и не каждый раз. Это означает, что иногда, когда сервер загружается, SQL не делает то же самое. Интересным фактом является то, что у нас есть несколько баз данных, работающих на сервере SQL, и они не отключаются вместе; одна из баз данных может сказать «(Ожидание восстановления)», в то время как другая работает нормально.

Я не смог найти решение этой проблемы или даже причину. Любые идеи?

РЕДАКТИРОВАТЬ:

После просмотра журналов событий сервера я обнаружил следующее:

Имя журнала: Источник приложения: MSSQL $ SQLEXPRESS Код события: 17204 Категория задачи: Уровень сервера: Ключевые слова ошибки: Классический Описание: FCB :: Open failed: Не удалось открыть файл C: \ Program Files \ Microsoft SQL Server \ MSSQL12.SQLEXPRESS \ MSSQL \ DATA \ DuraDB.mdf для файла номер 1. Ошибка ОС: 32 (процесс не может получить доступ к файлу, потому что он используется другим процессом.).

Что может вызвать блокировку файла, особенно после перезагрузки?

У вас запущен антивирусный сканер при доступе? Убедитесь, что вы правильно настроили исключения. Microsoft задокументировала это в KB309422. Также обратите внимание, что есть известные проблемы с некоторыми продуктами от McAfee и Sophos.

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

Кроме того, убедитесь, что в вашей системе Windows установлены последние обновления, а SQL Server обновлен до последнего пакета обновления (SP1 для SQL Server 2014).

Перейдите в диспетчер конфигурации Sql> Службы сервера Sql> Выберите тип службы (сервер Sql) щелкните правой кнопкой мыши, перейдите к свойствам Выберите «Вход в систему как Проверить эту учетную запись» и убедитесь, что имя вашей учетной записи - «NT SERVICE \ MSSQL $ SQLEXPRESS», затем нажмите «Пуск».

The Express versions automatically shutdown after a period of inactivity.     
There is a special sp_configure value you can set to increase the timeout.
Express Editions only have the 'user instance timeout' config item available.
The default is 60 minutes.

exec sp_configure 'show advanced options', 1
reconfigure
go
exec sp_configure 'user instance timeout'  -- show current value
go

/*
exec sp_configure 'user instance timeout', 65535  -- set to max timeout 
reconfigure
go
*/

В качестве альтернативы ваше приложение могло бы запускать простой "контрольный" запрос каждые 10 минут или около того, чтобы поддерживать работу SQL Server Express. SQL Server Express не позволяет использовать агент SQL, поэтому запланированное задание не будет работать. Вы также можете запланировать задание sqlcmd.exe с помощью Планировщика задач Windows.

Внутренне SQL Server восстанавливал ожидающие операции или транзакции базы данных. Мы должны подождать пару минут, и SQL Server автоматически восстановит базу данных.

Это произошло из-за того, что разработчик перезапустил службу, когда SQL Server выполнял большую операцию транзакции. Также может быть другая причина, например, очень большой файл журнала транзакций.

Я подготовил полную статью по этой проблеме, вы можете прочитать эту статью здесь.