日次の再起動ルーティンで急にSQL Serverが起動しなくなった(起動トラブル)SQL Serverトラブルシューティング(57)(1/2 ページ)

本連載は、「Microsoft SQL Server」で発生するトラブルを「どんな方法で」「どのように」解決していくか、正しい対処のためのノウハウを紹介します。今回は、「日時の再起動ルーティンで、ある日急にSQL Serverのサービスが起動しなくなった場合のトラブル例」を解説します。

» 2017年09月04日 05時00分 公開
[内ヶ島暢之ユニアデックス株式会社]

連載バックナンバー

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

トラブル 46(カテゴリー:起動トラブル):日次の再起動ルーティンでSQL Serverのサービスが起動しなくなった

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

トラブルの実例:日次のルーティンでサーバの再起動を行うシステムの運用管理を行っている。

 ある日、普段はすぐ再起動されるはずのSQL Serverが正常起動しなくなり、アプリケーションにエラーが発生してしまう事態になった。SQL ServerのERRORLOGが生成されていないので、SQL Serverのサービスそのものから起動していないようだ。

 このシステムはクラスタ化やミラーリング、可用性グループなどの可用性向上施策までは必要のないレベルの重要度と設定しているが、当日の業務進行には必要。代わりがないので、本日中に本システムでサービス起動を行う必要がある。

トラブルの原因を探る

 今回の事例は、「これしかない」システムを当日中に復旧させる必要があるシステムのトラブル例です。サーバにはSQL ServerのERRORLOGが作成されていなかったので、サービスそのものから起動していないことがまず分かりました(図1)。

photo 図1 SQL Server構成マネージャから起動しても起動に失敗する。この状況から、サービスとして起動されていないことが分かる

 ただしERRORLOGに出力がないので、どのタイミングで起動に失敗しているのかが分かりにくい状況です。サービスやOSの再起動を行ってもトラブルは解決しませんでした。

 そこで、サービスの問題なのか、SQL Serverの実行プログラムの問題なのかを切り分けるために「コマンドラインからの起動」を試します。

 SQL ServerはWindowsのサービスとして実行されるプログラムですが、その裏側では「Service Control Manager」呼ばれるコンポーネントからSQL Serverのプログラム本体である「sqlservr.exe」へ起動指令が送られることで起動が実行されます。これを手動で行ってみます(図2)。

photo 図2 SQL Serverを「コマンドラインからサービスを介さずに起動」したところ(注:今回は、意図的に必須ライブラリ「sqldk.dll」を削除して現象を再現しています)

 コマンドラインからサービスを介さずに実行することで、サービスからsqlservr.exeへ起動指令を出す際の問題なのか、sqlservr.exeそのものの起動の問題なのかを切り分けられます。図2では、「sqldk.dll」がないので起動できないというエラーメッセージから、sqlservr.exeの起動プロセスに原因があることが分かりました。

 Windowsの実行プログラム(拡張子:.exe)は、以下の起動プロセスを経て実行されます。

  1. Windowsが、起動したプログラムが“起動に適したフォーマット(Portable Executable)”になっているかどうかを確認する
  2. プログラムをメインメモリ上へロードする
  3. 必要なライブラリ(DLL)を適宜ロードする
  4. CPUがプログラムを1行ずつ実行する

 今回のトラブルは、他のプログラムやOSそのものの動作に問題はありませんでした。ですから(1)(2)のプロセスであるプログラム実行環境には問題はありません。図2の通り、(3)のプロセスで止まってしまったことになります。

       1|2 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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