Troubleshooting Connectivity #2 - エラー情報からわかる失敗原因

 

高橋 理香
SQL Developer Support Escalation Engineer

第一回目からだいぶ時間が空いてしまいました。。。
SQL Server への接続エラー発生時のトラブルシューティング 2 回目の今回は、接続時に発生するエラー情報を参考に解説します。

SQL Server への接続失敗の主な原因は?

前回、SQL Server へ接続するにあたって事前に必要となる準備についてご紹介しました。それらの事前チェック項目をすべて網羅することで基本的には接続は可能となりますが、それでもエラーになることはあります。エラーメッセージには、その原因を示す内容も含まれますので、主な原因を把握しておくことも重要です。これにより、第一回でご紹介した「OS レベルのセッション確立」、「ログイン認証」、「データベース アクセス」のいずれで問題があったのかを把握したり、さらに深く問題個所を絞り込むこともできます。

そこで、まずは接続処理のそれぞれの過程での失敗について、それらの一般的な原因をご紹介します。

OS レベルのセッション確立が失敗する原因は?

OS レベルのセッション確立が失敗するということは、一定時間内に接続先サーバーを見つけられなかった、もしくは、遅延により確立完了に至らなかったことを指します。そのため、主な原因としては以下の通りです。

  • 接続元で TCP ポートが枯渇していたために、接続要求の送信 (Syn パケット送信) に至らなかった。
  • 接続先サーバーへの接続要求が中継機器などで拒否されたなどの理由により、接続先サーバーに到達しなかった。
  • 順引き/逆引き両方での名前解決ができないため、SQL Server Browser サービスへの問い合わせが失敗した。
  • SQL Server Browser サービスが停止していたため、接続先の待ち受けポート番号を得られず、接続先サーバーに到達しなかった。
  • 接続先サーバーや SQL Server サービスが停止していた。
  • 指定されたプロトコルで待ち受けしていなかった。
  • クライアント/ネットワーク/サーバー等、通信経路上の負荷が高かったために、接続先サーバーとの通信に遅延が生じた。これにより、接続要求が接続サーバーへ到達しなかった、もしくは、接続先サーバーからの応答が接続元に到達しなかった。
ログイン認証が失敗する原因は?

認証処理が失敗するということは、指定されたログインが適切なアカウントで、かつ、SQL Server にアクセスするのに適切な権限を持っているかのチェックで拒否されたか、もしくは、そのチェックが一定時間内に完了しなかったことを指します。そのため、主な原因としては以下の通りです。

  • SQL Server にログインとして登録されていない。
  • SQL Server 認証で接続しようとしたが、パスワード ポリシーのチェックのために SQL Server からドメイン コントローラーへの問い合わせを行おうとしたが、遅延が生じたために完了できなかった。
  • SQL Server 認証で接続しようとしたが、SQL Server の認証モードが "Windows 認証モード" であった。
  • Windows 認証で接続しようとしたが、SQL Server からドメイン コントローラーへの問い合わせに遅延が生じたために認証処理を完了できなかった。
  • Windows 認証で接続しようとしたが、Kerberos 認証で必要となる SPN に関して、その登録が重複しているなどの問題があったために Kerberos 認証が失敗した。
データベースアクセスが失敗する原因は?

データベース アクセスが失敗するということは、対象のデータベースへのアクセスが拒否された、もしくは、一定時間内にデータベースがアクセスできる状態とならなかったことを指します。そのため、主な原因としては以下の通りです。

  • データベースが存在しない。
  • データベースがオフライン、復旧中など、アクセス受け入れ状態になっていない。
  • 対象のデータベースへのアクセス権が不足している。

SQL Server への接続失敗時にどのようなエラーが返されるのか?

接続処理のどの過程において、どのような問題でエラーとなったのかを判断するための最も簡単で重要な手段は、"エラーメッセージを確認する" ことです。 私たちサポート エンジニアが接続エラーについてお問い合わせ頂く場合も、必ず接続失敗時にどんなエラーが発生したのかを伺っています。そして、接続エラーが不明で再現できない場合には、有効な情報をお出しできないことがほとんどです。そのため、様々なツールを使って接続エラーを再現できる状態の場合には、SQL Server への接続テスト時に発生したエラーを記録しておくようにしてください。また、もしも SQL Server にアクセスするアプリケーションを開発している方ならば、エラーハンドラではエラーメッセージを取得できるよう実装することを検討ください。

では、エラーメッセージからはどのようなことがわかるのでしょうか?

以下に、それぞれの接続処理過程で発生しうる主なエラーメッセージを記載しました。もし SQL Server への接続が失敗する場合、以下から該当のエラーメッセージを探してみましょう。また、どの過程で失敗したのかを把握できたら、前回の「Troubleshooting Connectivity #1 - SQL Server への接続」の事前チェック項目をあらためて確認してみてください。そして、事前チェック項目はすべて網羅しているにもかかわらずエラーとなる場合には、エラーメッセージから原因を推測してみましょう。

なお、ご紹介するエラーメッセージは SQL Native Client 10.0 を使用して SQL Server 2008 R2 に接続した場合に発生するものです。また、参考として MDAC/Windows DAC (SQL ODBC/SQLOLEDB) の場合の例も一部記載しています。SQL Native Client 10.0 を使用していても、接続に使用するツールによっては、以下のエラー メッセージが追加の文章とともに記録されますが、以下でご紹介するメッセージが含まれているかどうかをチェックすることで、原因は判別可能です。

OS レベルのセッション確立

一定時間内に接続先が見つけることができないことが原因ですので、エラーメッセージにも主に接続先が見つからないことを示す内容が含まれます。

[遅延等により接続先サーバーに到達できなかった場合]

TCP Provider: そのようなホストは不明です。

[接続先 SQL Server が停止している、TCP/IP で待ち受けしていない、SQL Server Browser サービスへの問い合わせが失敗した場合]

指定された Server/Instance の位置を特定しているときにエラーが発生しました [xFFFFFFFF].

 

※参考

SQL ODBC や SQLOLEDBの場合には、いずれのケースも以下のメッセージが返されます。

指定された SQL Server が見つかりません。

名前付きパイプによる接続試行時は以下のとおりです。

SQL Server が存在しないか、アクセスが拒否されました。

 

ログイン認証

認証処理が失敗するということは、指定されたログインが適切なアカウントで、かつ、SQL Server にアクセスするのに適切な権限を持っているかのチェックで拒否されたか、もしくは、そのチェックが一定時間内に完了しなかったことを指します。また、エラーメッセージは主に SQL Server から返されますので、SQL Server のエラーログにもエラーが記録されている場合があります。

[SQL Server にログインとして登録されていない場合]

ユーザー 'xxx' はログインできませんでした。

SQL Server のエラーログには、もう少し詳細な情報として次のように記録されます。

エラー: 18456、重大度: 14、状態: 5。 ユーザー 'xxx' はログインできませんでした。 理由: 指定された名前に一致するログインが見つかりませんでした。

[SQL Server 認証で指定したパスワードが間違っている場合]

ユーザー 'xxx' はログインできませんでした。

SQL Server のエラーログには、もう少し詳細な情報として次のように記録されます。

エラー: 18456、重大度: 14、状態: 8。 ユーザー 'xxx' はログインできませんでした。 理由: パスワードが、指定されたログインのパスワードと一致しませんでした。

[Windows 認証モードの SQL Server に SQL Server 認証で接続しようとした場合]

ユーザー 'xxx' はログインできませんでした。

SQL Server のエラーログには、もう少し詳細な情報として次のように記録されます。

エラー: 18456、重大度: 14、状態: 58。 ユーザー 'xxx' はログインできませんでした。 理由: SQL 認証を使用したログインに失敗しました。サーバーは、Windows 認証専用に構成されています。

[Windows 認証で、ドメイン コントローラーへの問い合わせが失敗した場合]

SSPI コンテキストを生成できません

SQL Server 側では以下のエラーが記録されている場合があります。

エラー: 18452、重大度: 14、状態: 1。 ユーザー 'xxx' はログインできませんでした。このログインは SQL Server ログインなので、Windows 認証では使用できません。

または

エラー: 17806、重大度: 20、状態: 2。 SSPI のハンドシェイク統合セキュリティでは、接続を確立中にエラー コード xxxxxxxxxx のために失敗しました。接続が閉じられました。

※参考

SQL Server エラー ログの表示
https://msdn.microsoft.com/ja-jp/library/ms187885(v=sql.105).aspx

MSSQLSERVER_18456
https://msdn.microsoft.com/ja-jp/library/cc645917(v=sql.105).aspx

 

データベースアクセス

データベース アクセスが失敗するということは、対象のデータベースへのアクセスが拒否された、もしくは、一定時間内にデータベースがアクセスできる状態とならなかったことを指します。こちらもエラーメッセージは主に SQL Server から返されますので、SQL Server のエラーログにもエラーが記録されている場合があります。

[存在しないデータベースにアクセスしようとした、データベースがオフラインである、対象のデータベースへのアクセス権が不足している場合]

このログインで要求されたデータベース "xxxxx" を開けません。ログインに失敗しました。 ユーザー 'xxx' はログインできませんでした。

SQL Server のエラーログには、もう少し詳細な情報として次のように記録されます。

エラー: 18456、重大度: 14、状態: 38。 ユーザー 'xxx' はログインできませんでした。 理由: 明示的に指定されたデータベースを開けませんでした。

 

 

いかがでしたでょうか。接続失敗時に見られるエラーから、おおよその原因が推測できる点が少しでもお分かりいただけたらうれしいです。

次回は引き続き、一度確立した接続がエラーによって切断される場合についてご紹介する予定です。