Microsoft SQL Server リカバリーキットが提供する監視機能についてご説明します。
対象製品
・Microsoft SQL Server リカバリーキット (LifeKeeper for Windows)
※本処理概要は LifeKeeper for Windows v8.3 に付属するリカバリキットをもとに作成しています。
クイックチェック (quickCheck)
Windows の sc コマンドを使用して得られるサービスのステータスから、SQLServer サービスの起動状態を確認します。
SQLServer リソース作成時にオプションの保護サービスを追加した場合には、同様に sc query コマンドを使用して該当サービスのステータスを確認します。
※ オプションの保護サービスに対する監視は、quickCheck でのみおこなわれます。
sc query [サービス名]
サービスステータスに対する監視結果は以下となります。
RUNNNING:
サービスが正常に起動していると判断し、監視処理を終了します。
PAUSED:
障害とは判断せず、監視処理を終了します。
この場合、以下のようなメッセージをイベントログに出力します。
Error 14020 MSSQLServer has been manually paused. User intervention required to either restart or stop MSSQLServer. Aborting SQL quick check.
RUNNING、PAUSED 以外:
障害と判断します。
この監視によって障害が検出された場合、以下のようなメッセージをイベントログに出力します。
Error 14022 The action quickchk failed, the process MSSQLSERVER is not running.
詳細チェック (deepCheck)
(1) 最初にリソース作成時に入力した管理ユーザとパスワードでインスタンスに接続できるかどうかを確認します。
確認には以下のコマンドを使用します。
※ 以下のコマンドは SQL Server 2005 以降の場合です。 SQLServer 2000 以前の場合は、sqlcmd.exe ではなく isql.exe コマンドが用いられます。
sqlcmd.exe /U [管理ユーザ名] /P [パスワード] /S [インスタンス名] /Q "sp_helpdb"
接続できなかった場合、監視失敗と判断して以下のようなメッセージをイベントログに出力します。
Error 14015 SQL login failed. The user/password associated with the LifeKeeper SQL resource does not have appropriate permissions to %s
※ ユーザー名やパスワードの問題でログインできなかった場合、フェイルオーバーの対象とはなりません。
(2) (1) で接続に成功した場合、マスター DB にクエリーを発行し、結果を取得できるかどうかを確認します。
確認には以下のコマンドを使用します。
※ 以下のコマンドは SQL Server 2005 以降の場合です。 SQLServer 2000 以前の場合は、sqlcmd.exe ではなく isql.exe コマンドが用いられます。
sqlcmd.exe /U [管理ユーザ名] /P [パスワード] /S [インスタンス名] /Q “select name from sysdatabases”
結果を取得できなかった場合、監視失敗と判断します。
この監視によって障害が検出された場合、以下のようなメッセージをイベントログに出力します。
Error 14014 Could not access the database %s for %s. SQL query failed
起動処理 (restore)
(1) 最初に MSSQL リソースのステータスを確認します。
既に ISP である場合は起動が完了しているものと判断して起動処理を終了し、以下のようなメッセージをイベントログへ出力します。
Information 14027 The resource [リソース名] is already in service on [ノード名]
(2) 以下コマンドを実行し、SQLServer 本体のサービス名を取得します。
sc query [SQLServer 本体のサービス名]
サービス名を取得できなかった場合、起動失敗と判断して起動処理を終了します。
(3) SQLServer 本体のサービスに対してサービス起動状況を取得するため、以下コマンドを実行します。
$LKBIN/ScQueryState [起動するサービスのサービス名]
(3-1) 取得したサービスの状態が RUNNING 以外の場合、以下のコマンドを実行します。
sc start [起動するサービスのサービス名]
既にサービスの状態が RUNNING の場合、サービスが起動したものと判断して (3-2) へ進みます。
(3-2) (3-1) で実行した起動コマンドでサービスが起動した場合、以下のメッセージをイベントログへ出力します。
Information 14044 [起動するサービスのサービス名] service has started
サービスを起動できなかった場合、起動に失敗したと判断して起動処理を終了します。
(4) オプションサービスも保護する場合は、SQLServer 本体のサービス起動完了後に、(3) と同様の処理をオプションサービスに対して実行します。
オプションサービスを保護しない場合は、(5) へ進みます。
(5) 起動した SQLServer 本体のサービスに対して、最初にリソース作成時に入力した管理ユーザとパスワードでインスタンスに接続できるかどうかを確認します。
確認には以下のコマンドを使用します。
※ 以下のコマンドは SQL Server 2005 以降の場合です。 SQLServer 2000 以前の場合は、sqlcmd.exe ではなく isql.exe コマンドが用いられます。
sqlcmd.exe /U [管理ユーザ名] /P [パスワード] /S [インスタンス名] /Q "sp_helpdb"
停止処理 (remove)
(1) 最初に MSSQL リソースのステータスを確認し、ISP ではない場合は停止処理を終了し、以下のようなメッセージをイベントログへ出力します。
Information 14024 MSSQLServer instance [リソース名] is not in-service on [ノード名]
(2) オプションで保護するサービスが存在する場合には各サービスを停止するため、以下のコマンドを実行して各オプションサービスの起動状況を1つずつ取得します。
オプションのサービスが存在しない場合、(3) へ進みます。
$LKBIN/ScQueryState.exe [オプションのサービス名]
取得したサービスの状態が RUNNING、あるいは PAUSED の場合、以下のコマンドを実行してサービスを停止します。
sc stop [オプションのサービス名]
オプションサービスが停止した場合、次のオプションサービスを停止します。
タイムアウトによりサービスを停止できなかった場合は、remove 処理の失敗とせずに次のサービスの停止処理を行います。
(3) SQLServer 本体のサービスを停止するため、以下のコマンドを実行してサービス起動状況を取得します。
$LKBIN/ScQueryState.exe [SQLServer 本体のサービス名]
(3-1) 取得したサービスの状態が RUNNING、あるいは PAUSED の場合、以下のコマンドを実行してサービスを停止します。
sc stop [SQLServer 本体のサービス名]
sc stop コマンド実行後サービスが停止した場合、処理に成功したと判断して停止処理を終了します。
(3-2) (3-1) の処理で SQLServer 本体サービスを停止できなかった場合、以下のコマンドを実行して再度 SQLServer 本体のサービスの停止を行います。
net stop [SQLServer 本体のサービス名]
net stop コマンド実行後サービスが停止した場合は、処理に成功したと判断して停止処理を終了します。
(3-3) (3-2) の処理で SQLServer 本体サービスを停止できなかった場合、(3-1) の処理をもう一度実行してサービス停止を試みます。
サービスが停止した場合は、処理に成功したと判断して停止処理を終了します。
本処理でもサービスを停止できなかった場合、処理に失敗したと判断して停止処理を終了します。
回復処理 (recover)
起動処理 (restore) と同一の処理を行います。
改訂履歴
[公開日:2011年3月16日] [更新日:2016年3月31日] 記事の体裁を修正しました。
[更新日:2016年11月30日] 以下の処理概要を追加しました。
・起動処理(restore)
・停止処理(remove)
・回復処理(recover)