本連載は、「Microsoft SQL Server」で発生するトラブルを「どんな方法で」「どのように」解決していくか、正しい対処のためのノウハウを紹介します。今回は、「日時の再起動ルーティンで、ある日急にSQL Serverのサービスが起動しなくなった場合のトラブル例」を解説します。
本連載では、「Microsoft SQL Server(以下、SQL Server)」で発生するトラブルについて、「なぜ起こったか」の理由とともに具体的な対処方法を紹介していきます。
「Windows Server 2012 R2」上に「SQL Server 2016 RTM」をインストールした環境を想定して解説します。
トラブルの実例:日次のルーティンでサーバの再起動を行うシステムの運用管理を行っている。
ある日、普段はすぐ再起動されるはずのSQL Serverが正常起動しなくなり、アプリケーションにエラーが発生してしまう事態になった。SQL ServerのERRORLOGが生成されていないので、SQL Serverのサービスそのものから起動していないようだ。
このシステムはクラスタ化やミラーリング、可用性グループなどの可用性向上施策までは必要のないレベルの重要度と設定しているが、当日の業務進行には必要。代わりがないので、本日中に本システムでサービス起動を行う必要がある。
今回の事例は、「これしかない」システムを当日中に復旧させる必要があるシステムのトラブル例です。サーバにはSQL ServerのERRORLOGが作成されていなかったので、サービスそのものから起動していないことがまず分かりました(図1)。
ただしERRORLOGに出力がないので、どのタイミングで起動に失敗しているのかが分かりにくい状況です。サービスやOSの再起動を行ってもトラブルは解決しませんでした。
そこで、サービスの問題なのか、SQL Serverの実行プログラムの問題なのかを切り分けるために「コマンドラインからの起動」を試します。
SQL ServerはWindowsのサービスとして実行されるプログラムですが、その裏側では「Service Control Manager」呼ばれるコンポーネントからSQL Serverのプログラム本体である「sqlservr.exe」へ起動指令が送られることで起動が実行されます。これを手動で行ってみます(図2)。
コマンドラインからサービスを介さずに実行することで、サービスからsqlservr.exeへ起動指令を出す際の問題なのか、sqlservr.exeそのものの起動の問題なのかを切り分けられます。図2では、「sqldk.dll」がないので起動できないというエラーメッセージから、sqlservr.exeの起動プロセスに原因があることが分かりました。
Windowsの実行プログラム(拡張子:.exe)は、以下の起動プロセスを経て実行されます。
今回のトラブルは、他のプログラムやOSそのものの動作に問題はありませんでした。ですから(1)(2)のプロセスであるプログラム実行環境には問題はありません。図2の通り、(3)のプロセスで止まってしまったことになります。
Copyright © ITmedia, Inc. All Rights Reserved.