エラー: 18456、重大度: 14、状態: 38
-
2011年3月16日 6:33はじめまして。「状態38:Login valid but database unavailable (or login not permissioned)」の原因についてご教示ください。(環境は文末に纏めて記述します)
サービスの依存関係を設定して、SQL Server→業務アプリ の順番にサービスが起動するようにしており、業務アプリが起動するとSQL Serverに接続するようになっています。業務アプリは約1年稼働し続け、毎日業後にWindowsをシャットダウン、始業にシステム起動を行う運用としています。そのような運用の中、一度だけ「エラー: 18456、重大度: 14、状態: 38」が発生しました。なお、業務アプリで設定しているデータベースおよびユーザ、パスワードは固定文字列で、毎回同じ文字列でログインしています。
SQL Serverのログから、コネクション接続が確立された後にログオンエラーが発生していることが見て取れますので、処理順は正しいように見受けられます。(SQL Serverのログについては文末をご確認ください)
そうすると、Windowsサービスの依存関係が担保されているか疑わしくなります。依存関係は、MSSQL$XXXのサービスに対して、「このサービスに依存しているシステムコンポーネント」に業務アプリサービスを設定しています。対処方法などお分かりであればご教示願います。
◇環境Windows7 32bitSQL Server 2008 SP1 Standard EditionSQL Server認証モードを利用接続ユーザ「user1」のロールは、db_datareader、db_datawriterを設定SQL Serverと業務アプリとは同一マシンにインストール
◇SQL Serverログ2011-03-11 06:55:36.16 spid14s Starting up database 'XXXDB'.2011-03-11 06:55:36.47 サーバー A self-generated certificate wassuccessfully loaded for encryption.2011-03-11 06:55:36.48 サーバー Server local connection provider isready to accept connection on [ \\.\pipe\SQLLocal\XXXDB ].2011-03-11 06:55:36.48 サーバー Server local connection provider isready to accept connection on [ \\.\pipe\MSSQL$XXXDB\sql\query ].2011-03-11 06:55:36.48 サーバー Server is listening on [ ::1 <ipv6> 52840].2011-03-11 06:55:36.48 サーバー Server is listening on [ 127.0.0.1<ipv4> 52840].2011-03-11 06:55:36.48 サーバー Dedicated admin connection support wasestablished for listening locally on port 52840.2011-03-11 06:55:36.48 サーバー The SQL Server Network Interface librarycould not register the Service Principal Name (SPN) for the SQL Serverservice. Error: 0x54b, state: 3. Failure to register an SPN may causeintegrated authentication to fall back to NTLM instead of Kerberos. Thisis an informational message. Further action is only required if Kerberosauthentication is required by authentication policies.2011-03-11 06:55:36.48 サーバー SQL Server is now ready for clientconnections. This is an informational message; no user action is required.2011-03-11 06:55:37.68 ログオン エラー: 18456、重大度: 14、状態: 38。2011-03-11 06:55:37.68 ログオン Login failed for user 'user1'. 理由: 明示的に指定されたデータベースを開けませんでした。 [クライアント: <localmachine>]2011-03-11 06:55:43.11 spid13s CHECKDB for database 'msdb' finishedwithout errors on 2011-03-10 12:20:04.950 (local time). This is aninformational message only; no user action is required.2011-03-11 06:55:43.16 spid14s Recovery is writing a checkpoint indatabase 'XXXDB' (5). This is an informational message only. No useraction is required.
すべての返信
-
2011年3月16日 13:39
エラー 18456 状態 38 について、同じような経験があります。
このエラーは、該当のデータベースに接続しようとした時に、まだ データベースが使用可能状態でない場合に発生するみたいです。
サービスの依存関係とありますが、これは サービスのステータスをもとに判断しています。
SQL Server の起動処理(リカバリ処理)が開始された時点で、サービスのステータスは開始となりますので、サービスの依存関係があったとしても、アプリケーションからデータベースに対して接続時、データベースの起動処理が完了していない状況は起こりえるのではないかと。
私が行った対処は、アプリケーション側で 接続に失敗した場合、接続ができるまでリトライ処理を実施するように変更しました。
必ず SQL Server 上のデータベース起動処理が完了後にアプリケーションを開始したい場合は、SQL Server Agent から アプリケーション(サービス)を起動したり、 sp_procoption を使用して、ストアドプロシージャからアプリケーションを起動することでしょうか。
sp_procoption (Transact-SQL)
http://msdn.microsoft.com/ja-jp/library/ms181720(v=SQL.100).aspx- 回答としてマーク Nuno5963 2011年3月18日 1:48
-
2011年3月18日 1:48
分かり易く解説頂き有難うございました!
アプリケーション側を修正し、接続ができるまでリトライ処理を実施するよう対応します。

