Когда база данных SQL Server готова к приему запросов?

11

В файле журнала ошибок SQL Server я нашел следующие строки:

2018-02-22 14:10:58.95 spid17s     Starting up database 'msdb'.
2018-02-22 14:10:58.95 spid16s     Starting up database 'ReportServer'.
2018-02-22 14:10:58.95 spid18s     Starting up database 'ReportServerTempDB'.
2018-02-22 14:10:58.95 spid19s     Starting up database 'XYZ'.

Если до этого времени я проверяю состояние базы данных XYZ, она ONLINEиспользует следующее утверждение:

SELECT state_desc FROM sys.databases WHERE name='XYZ'

... но когда я пытаюсь подключиться к этой базе данных с помощью приложения C #, он не может подключиться к базе данных.

Ошибка:

Не удалось войти в систему для пользователя «asd».
Причина: не удалось открыть явно указанную базу данных.

Я пробовал трех разных пользователей (пользователь Windows, sa, пользователь SQL Server, определенный для приложения). Проблема возникает, когда я запускаю приложение при запуске ОС, но если я запускаю его вручную после запуска, ошибок не возникает, поэтому я считаю, что все параметры SQL Server и параметры брандмауэра верны.

Я также проверял перед этим, что статус сервиса работает.

Что еще я должен проверить, чтобы убедиться, что база данных действительно подключена и готова для запросов?

Я ищу ключ, который говорит мне, что можно делать запросы к базе данных, вместо того, чтобы откладывать на какое-то время (даже не по понятной причине).

Я думал о сканировании журнала ошибок на наличие текста «Запуск базы данных« XYZ »», но это означает, что мне нужно добавить настройку приложения для пути к журналу ошибок SQL Server. Это также означает чтение файла много раз, пока я не найду эту фразу.

Ahmed
источник

Ответы:

23

База данных SQL Server готова принимать запросы, как только:

SELECT DATABASEPROPERTYEX(N'database name', 'Collation')

не возвращается NULL.

Из документации для DATABASEPROPERTYEX(Transact-SQL) :

Примечание. ONLINEСтатус может быть возвращен, когда база данных открыта и еще не восстановлена. Чтобы определить, когда база данных может принимать соединения, запросите свойство Collation объекта DATABASEPROPERTYEX. База данных может принимать соединения, когда сопоставление базы данных возвращает ненулевое значение. Для баз данных Always On запросите столбцы database_stateили .database_state_descsys.dm_hadr_database_replica_states

Пол Уайт 9
источник
3

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

Если вы хотите, чтобы приложение входило только после того, как восстановление выполнено, а база данных готова, повторите попытку подключения.

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

Брент Озар
источник