再起動したらSQL Serverへアクセスできなくなった(起動トラブル):SQL Serverトラブルシューティング(17)
本連載は、「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)。
なお、PINGは問題なく通っているので物理的な切断ではないようだ。Windowsのアプリケーションログ(「イベントビューアー」→「Windows ログ」→「Application」)を確認しても、関連すると思われるエラーは記録されていなかった。
トラブルの原因を探る
こういったシーンでは、「正常に動作していた前回再起動時のログ」と比較して確認します。
前回再起動時のWindowsのアプリケーションログと直近のアプリケーションログの内容を比べてみたところ、「情報26022」の出力回数とメッセージ内の数値に違いがあることが分かりました(図12-2)。
第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へアクセスできなくなった」場合の解決手順
- SQL Serverの待ち受け状況を確認する
- 名前付きインスタンスを使用しており、SQL Server Browserサービスが起動していなかった場合は、正しくSQL Server Browserサービスを起動する
- SQL Server Browserサービスを使わない場合は、ポート番号付きの接続文字列や別名を使用する
筆者紹介
内ヶ島 暢之(うちがしま のぶゆき)
ユニアデックス株式会社所属。Microsoft MVP Data Platform(2011〜 )。OracleやSQL Serverなど商用データベースの重大障害や大型案件の設計構築、プリセールス、社内外の教育、新技術評価を行っていた。2016年4月よりIoTビジネス開発の担当となり、新しい仕事に奮闘中。ストレッチをして柔らかい身体を手に入れるのが当面の目標。
椎名 武史(しいな たけし)
ユニアデックス株式会社所属。入社以来 SQL Serverの評価/設計/構築/教育などに携わりながらも、主にサポート業務に従事。SQL Serverのトラブル対応で社長賞の表彰を受けた経験も持つ。休日は学生時代の仲間と市民駅伝に参加し、銭湯で汗を流してから飲み会へと流れる。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- クエリストアって何だ? SQL Server 2016のパフォーマンス向上に注目
2015年6月に開催されたイベント「DB tech showcase」の講演の中から、2016年にも正式版がリリースされる次期SQL Serverの目玉機能をウオッチ。 - そもそも、リレーショナルデータベースとは何か?
データベースを基礎から勉強し理解を深めていくことは簡単なことではありません。本連載では、データベースに対するハードルを少しでも低くするために、初心者の方に必要なデータベースの基本から、障害対策やチューニングといった実践に即した内容までを幅広く解説していきます。今回は、データベースの役割と、それを管理するソフトウェアであるDBMSの基本機能について解説します。【更新】 - Oracle運用の基本「ログ」を理解しよう
本連載では、Oracle Database運用の鍵となるトラブル対処法について紹介していきます。第1回、第2回では情報収集の要となるログについて見ていきます。ログの出力情報は10gと11gとでは大きく異なる点がありますので、それぞれについても確認しておきましょう。 - 「SQL Server 2016」に搭載される新たなセキュリティ対策を追う
パブリックプレビューが公開されているマイクロソフトのRDB次期版「SQL Server 2016」。特徴の1つとするセキュリティ対策機能のポイントと目指すところをキーパーソンに聞いた。 - データの登録を行うINSERT文
- 複数の条件を指定してSELECT文を実行する
前回は、SELECT文の初歩の初歩を解説しました。今回は、複数の条件を指定して、目的のデータを取り出す方法を解説します(編集部)