連載
» 2016年09月16日 05時00分 UPDATE

SQL Serverトラブルシューティング(17):再起動したらSQL Serverへアクセスできなくなった(起動トラブル)

本連載は、「Microsoft SQL Server」で発生するトラブルを「どんな方法で」「どのように」解決していくか、正しい対処のためのノウハウを紹介します。今回は「再起動したらSQL Serverへアクセスできなくなってしまった場合の対処方法」を解説します。

[椎名武史,ユニアデックス株式会社]

連載バックナンバー

 本連載では、「Microsoft SQL Server(以下、SQL Server)」で発生するトラブルについて、「なぜ起こったか」の理由とともに具体的な対処方法を紹介していきます。

トラブル 12(カテゴリー:起動):再起動したらSQL Serverへアクセスできなくなった

 「Windows Server 2012 R2」上に「SQL Server 2016 RTM」をインストールした環境を想定して解説します。

トラブルの実例:ある日、再起動したらSQL Serverへアクセスできなくなった

 「名前付きインスタンス」を導入後、アプリケーションを含めさまざまなテストを実施し、動作に問題がないことを確認。また、不要なサービスは基本的に無効にする方針により、無効にしてもアプリケーションの動作に影響がないと思われるサービスを、動作確認した上で無効にして、本番運用を開始した。本番環境は、複数回実施した定期メンテナンスを含めて、しばらくは問題なく稼働していた。

 しかし、ある日行った再起動を境に、「SQL Serverへの接続を確立しているときにネットワーク関連またはインスタンス固有のエラーが発生しました。サーバーが見つからないかアクセスできません。インスタンス名が正しいこと、およびSQL Serverがリモート接続を許可するように構成されていることを確認してください。 (provider: SQL Network Interfaces, error: 26 - 指定されたサーバーまたはインスタンスの位置を特定しているときにエラーが発生しました) (Microsoft SQL Server、エラー: -1)」というエラーが表示され、アプリケーションサーバからSQL Serverに接続できなくなってしまった(図12-1)。

photo 図12-1 アプリケーションサーバからSQL Serverに接続できなくなった

 なお、PINGは問題なく通っているので物理的な切断ではないようだ。Windowsのアプリケーションログ(「イベントビューアー」→「Windows ログ」→「Application」)を確認しても、関連すると思われるエラーは記録されていなかった。

トラブルの原因を探る

 こういったシーンでは、「正常に動作していた前回再起動時のログ」と比較して確認します。

 前回再起動時のWindowsのアプリケーションログと直近のアプリケーションログの内容を比べてみたところ、「情報26022」の出力回数とメッセージ内の数値に違いがあることが分かりました(図12-2)。

photo 図12-2 前回のログと見比べると、TCPポート番号の数値が違うことが分かった

 第5回「アプリケーションが、どのプロトコルで接続しているのかを確認する」で解説した通り、SQL Serverが稼働する異なるサーバ間で通信するときには、プロトコルに「TCP/IP」か「名前付きパイプ」を使用します。今回の例における「情報26022」内の数値「60854」は、SQL Serverが待ち受けているTCPのポート番号を示しています。

 SQL Serverの名前付きインスタンスは、既定動作では動的ポートを使ってクライアントからの接続を待ち受けます。クライアントは「SQL Server Browserサービス」(*1)に問い合わせることで、SQL Serverが使っているポート番号を取得します。一度取得したポート番号はクライアント側のキャッシュに保存され、次回も同じポート番号を使って接続を試みます。また、SQL Serverも前回使った動的ポートが空いている限り、同じポート番号で待ち受けます。


 今回の例では、SQL Server Browserサービスを無効にしたことがトラブルの引き金になってしまったようです。

 テスト時点では、SQL Server Browserサービスが起動していました。アプリケーションサーバからSQL Serverへの接続を正しく確立でき、「接続可能なポート番号」をキャッシュしました。

 しかしその後、SQL Server Browserサービスを無効にしました。クライアントは新しいポート番号を取得できなくなります。しかし、SQL Serverのポート番号が同じままならば、変わらずに、問題が起こっていないかのように接続できてしまいます。そして、トラブルは「SQL Serverのポート番号が変更された時点」で発生します。SQL Server Browserサービスを無効にした日と「SQL Serverのポート番号が変更された日」にタイムラグがあるので、直接の原因を特定しにくく、「なぜ急に/今まで大丈夫だったのに」と困惑してしまうのでしょう。

解決方法

 このトラブルの解決方法は、「SQL Server Browserサービスを起動(有効に)すること」です。クライアントがSQL Server Browserサービスに接続できれば、SQL Serverのポート番号が変わっても正しく接続できます。

 もう1つは、SQL Serverの待ち受けポート番号を「固定」することです。クライアントの接続文字列に明示的にポート番号を付加して接続するか、別名を使用して運用します。ただし、ポート番号を固定する運用においては、そのポート番号が別のアプリケーションに先に使用されると、今度はSQL Serverの起動が失敗するので注意してください。

「再起動したらSQL Serverへアクセスできなくなった」場合の解決手順

  1. SQL Serverの待ち受け状況を確認する
  2. 名前付きインスタンスを使用しており、SQL Server Browserサービスが起動していなかった場合は、正しくSQL Server Browserサービスを起動する
  3. SQL Server Browserサービスを使わない場合は、ポート番号付きの接続文字列や別名を使用する


本トラブルシューティングの対応バージョン:SQL Server 全バージョン

筆者紹介

内ヶ島 暢之(うちがしま のぶゆき)

ユニアデックス株式会社所属。Microsoft MVP Data Platform(2011〜 )。OracleやSQL Serverなど商用データベースの重大障害や大型案件の設計構築、プリセールス、社内外の教育、新技術評価を行っていた。2016年4月よりIoTビジネス開発の担当となり、新しい仕事に奮闘中。ストレッチをして柔らかい身体を手に入れるのが当面の目標。

椎名 武史(しいな たけし)

ユニアデックス株式会社所属。入社以来 SQL Serverの評価/設計/構築/教育などに携わりながらも、主にサポート業務に従事。SQL Serverのトラブル対応で社長賞の表彰を受けた経験も持つ。休日は学生時代の仲間と市民駅伝に参加し、銭湯で汗を流してから飲み会へと流れる。


Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。