Коли база даних 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. Це також означає прочитати файл багато разів, поки я не знайду цю фразу.

Відповіді:


23

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

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

не повертається NULL.

З документації для DATABASEPROPERTYEX(Transact-SQL) :

Примітка. ONLINEСтатус може бути повернутий під час відкриття бази даних та ще не відновленої. Щоб визначити, коли база даних може приймати з'єднання, запитайте властивість Collation у DATABASEPROPERTYEX. База даних може приймати з'єднання, коли порівняння бази даних повертає ненулеве значення. Для баз даних Завжди на базі даних запитуйте стовпці database_stateабо database_state_descстовпці sys.dm_hadr_database_replica_states.


3

Бази даних SQL Server запускаються, але потім їм потрібно проаналізувати журнал транзакцій, щоб прокрутити транзакції вперед та назад. Цей процес може зайняти від мілісекунд до годин (навіть днів!) У разі тривалої транзакції, багатьох (думаю тисячі) баз даних користувачів або баз даних з безліччю (думають десятки тисяч) віртуальних файлів журналу.

Якщо ви хочете, щоб програма запускалася лише тоді, коли відновлення завершено, і база даних готова, попросіть програму повторити його з'єднання.

Якщо ви хочете, щоб програма могла негайно потрапити на SQL Server, але, можливо, ще не зможе запустити жодних запитів, встановіть її базу даних за замовчуванням на TempDB замість бази даних користувача. Ймовірно, це буде одразу в Інтернеті, навіть коли бази даних користувачів недоступні.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.