FAQ: SQL Server 起動後、接続が可能となるタイミングは?

 

神谷 雅紀
Escalation Engineer

 

SQL Server の起動が開始し、サービスステータスが RUNNING になった時点でクライアント接続は可能です。

ただし、既定のデータベースが master 以外に設定されているログインについては、既定のデータベースの復旧が完了するまでは接続することはできません。既定のデータベースの復旧が完了する前の接続試行は、エラー 18456 「ユーザー 'XXX' はログインできませんでした。 理由: 明示的に指定されたデータベースを開けませんでした。」で失敗します。

エラーログファイルでは以下のタイミングです。(エラーログファイルについては [SQL Troubleshooting] 第1回 : Tips - SQL Server エラーログとイベント ログを採取する (SQL 2000 ~ 2008 R2))

起動開始。

2012-05-08 14:13:56.10 Server      Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64)     Jun 17 2011 00:54:03     Copyright (c) Microsoft Corporation     Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)

2012-05-08 14:13:56.10 Server      (c) Microsoft Corporation. 2012-05-08 14:13:56.10 Server      All rights reserved. 2012-05-08 14:13:56.10 Server      Server process ID is 1234.

...

master データベースの復旧。

2012-05-08 14:13:56.33 spid6s      Starting up database 'master'. 2012-05-08 14:13:56.43 spid6s      Recovery is writing a checkpoint in database 'master' (1).

...

クライアント接続用待ち受け開始

2012-05-08 14:13:57.42 Server      Server is listening on [ 'any' <ipv6> 1433]. 2012-05-08 14:13:57.43 Server      Server is listening on [ 'any' <ipv4> 1433]. 2012-05-08 14:13:57.43 Server      Server local connection provider is ready to accept connection on [ \\.\pipe\SQLLocal\MSSQLSERVER ]. 2012-05-08 14:13:57.43 Server      Server local connection provider is ready to accept connection on [ \\.\pipe\sql\query ]. 2012-05-08 14:13:57.44 Server      Server is listening on [ ::1 <ipv6> 1434]. 2012-05-08 14:13:57.44 Server      Server is listening on [ 127.0.0.1 <ipv4> 1434]. 2012-05-08 14:13:57.45 spid10s     Clearing tempdb database.

...

このメッセージが記録された時点でクライアント接続が可能。この時点でサービスステータスは START PENDING (開始中) から RUNNING (実行中) になる。

2012-05-08 14:13:57.59 Server      SQL Server is now ready for client connections.

...

ただし、まだ復旧が完了していないデータベースが既定のデータベースになっているログインは接続不可。 既定のデータベースの復旧が完了していない時点での接続試行は、エラー 18456「ユーザー 'XXX' はログインできませんでした。 理由: 明示的に指定されたデータベースを開けませんでした。」で失敗する。

2012-05-08 14:13:57.95 spid13s     Starting up database 'msdb'. 2012-05-08 14:13:57.95 spid14s     Starting up database 'testdb1'. 2012-05-08 14:13:57.96 spid15s     Starting up database 'testdb2'. 2012-05-08 14:13:57.96 spid16s     Starting up database 'testdb3'. 2012-05-08 14:13:57.97 spid17s     Starting up database 'testdb4'. 2012-05-08 14:13:57.99 spid18s     Starting up database 'testdb5'. 2012-05-08 14:13:58.76 spid10s     Starting up database 'tempdb'.

...

このメッセージが記録された時点で、 結果的に復旧に失敗したデータベースがあったとしても全データベースの復旧処理は完了。 復旧に成功してオンラインとなったデータベースが既定のデータベースになっているログインはすべて接続可能となる。

2012-05-08 14:14:05.78 spid6s      Recovery is complete.

 

以下は、全データベースの復旧処理が完了した直後 (Recovery is complete. がエラーログファイルに記録された直後) に実行されます。SQL Server へのアクセスを行うアプリケーションやサービスを全データベースの復旧処理が完了した後に起動したい場合は、以下の方法を用いて起動することで、確実に全データベースの復旧処理が完了した後に起動を行うことができます。

※ SQL Server 2008 CU7 以降、SQL Server 2008 SP1 CU3 以降では、既定では、SQL Server Agent サービスの起動時に実行されるようにスケジュールされているジョブは、すべてのデータベースではなく msdb の復旧が完了した時点で実行が開始されるように動作変更されています。
すべてのデータベースの復旧完了後にジョブが開始されるようにするためには、KB 2640027 に従って SQL Server 2008 SP2 CU8 以降または SP3 CU7 (2012 年 9 月リリース予定) 以降をインストールし、レジストリを設定する必要があります。
または、スタートアッププロシージャから sp_start_job を呼び出すことで、すべてのデータベース復旧完了後にジョブを実行することもできます。