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」のログインに失敗しました。
理由:明示的に指定されたデータベースを開くことができませんでした。

3つの異なるユーザー(Windowsユーザー、sa、アプリケーションに定義されたSQL Serverユーザー)を試しました。OSの起動時にアプリケーションを実行すると問題が発生しますが、起動後に手動で起動してもエラーは発生しないため、SQL Serverの設定とファイアウォールの設定はすべて正しいと思います。

この前に、サービスステータスが実行されていることも確認しました。

データベースが実際にオンラインでクエリの準備ができていることを確認するために、他に何をチェックする必要がありますか?

時間を遅らせるのではなく、データベースにクエリを実行しても問題ないことを示すキーを探しています(明確な理由に基づいていなくても)。

エラーログをスキャンして "Starting up database 'XYZ'"というテキストを検索することを考えましたが、これは、SQL Serverエラーログのパスのアプリケーションの設定を追加する必要があることを意味します。これは、このフレーズが見つかるまで何度もファイルを読み取ることを意味します。

回答:


23

SQL Serverデータベースは、次のようにすぐにクエリを受け入れる準備ができています。

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

戻りませんNULL

DATABASEPROPERTYEX(Transact-SQL)のドキュメントから:

注:このONLINEステータスは、データベースが開かれていてまだ回復されていないときに返される場合があります。データベースが接続を受け入れることができる時期を特定するには、のCollat​​ionプロパティをクエリしますDATABASEPROPERTYEX。データベース照合がnull以外の値を返す場合、データベースは接続を受け入れることができます。Always Onデータベースの場合は、database_stateまたはのdatabase_state_desc列をクエリしますsys.dm_hadr_database_replica_states


3

SQL Serverデータベースは起動しますが、トランザクションログを分析して、トランザクションを前後にロールバックする必要があります。このプロセスは、長時間のトランザクション、多数(数千と考える)のユーザーデータベース、または大量(数万と考える)の仮想ログファイルを含むデータベースの場合、数ミリ秒から数時間(場合によっては!

回復が完了してデータベースの準備ができたときにのみアプリを起動する場合は、アプリケーションに接続を再試行させます。

アプリがSQL Serverにすぐにアクセスできるようにしたいが、まだクエリを実行できない場合は、デフォルトデータベースをユーザーデータベースではなくTempDBに設定します。ユーザーデータベースが利用できない場合でも、すぐにオンラインになります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.