none
エラー: 18456、重大度: 14、状態: 38

    質問

  • はじめまして。
    「状態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 32bit
    SQL Server 2008 SP1 Standard Edition
    SQL 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 was
    successfully loaded for encryption.
    2011-03-11 06:55:36.48 サーバー Server local connection provider is
    ready to accept connection on [ \\.\pipe\SQLLocal\XXXDB ].
    2011-03-11 06:55:36.48 サーバー Server local connection provider is
    ready 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 was
    established for listening locally on port 52840.
    2011-03-11 06:55:36.48 サーバー The SQL Server Network Interface library
    could not register the Service Principal Name (SPN) for the SQL Server
    service. Error: 0x54b, state: 3. Failure to register an SPN may cause
    integrated authentication to fall back to NTLM instead of Kerberos. This
    is an informational message. Further action is only required if Kerberos
    authentication is required by authentication policies.
    2011-03-11 06:55:36.48 サーバー SQL Server is now ready for client
    connections. 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'. 理由: 明
    示的に指定されたデータベースを開けませんでした。 [クライアント: <local
    machine>]
    2011-03-11 06:55:43.11 spid13s CHECKDB for database 'msdb' finished
    without errors on 2011-03-10 12:20:04.950 (local time). This is an
    informational message only; no user action is required.
    2011-03-11 06:55:43.16 spid14s Recovery is writing a checkpoint in
    database 'XXXDB' (5). This is an informational message only. No user
    action is required.

    2011年3月16日 6:33

回答

  • エラー 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月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月16日 13:39
  • 分かり易く解説頂き有難うございました!

    アプリケーション側を修正し、接続ができるまでリトライ処理を実施するよう対応します。


    2011年3月18日 1:48