これは InterSystems FAQ サイトの記事です。
ミラーの現在の状態は、管理ポータルのミラーモニタで確認できます。
こちらのトピックでは、それらの情報をコマンドで確認する方法をご紹介します。
(1) フェイルオーバメンバ(プライマリ・バックアップ)の状態を確認する
(4) 定期的にミラーステータスを取得するサンプル(ツール)のご紹介
では、以下のようなミラーの状態を確認してみます(以下はフェイルオーバーメンバ・プライマリの状態)。
(1) フェイルオーバメンバ(プライマリ・バックアップ)の状態を確認する
フェイルオーバメンバのミラーの状態は、SYS.Mirror クラスの GetFailoverMemberStatus メソッドで確認できます。
結果は出力引数に$list形式で返されます。詳細はクラスリファレンスをご覧ください。
例)
プライマリ、バックアップともActiveな状態
// フェイルオーバーメンバ(プライマリまたはバックアップ)で確認
// 以下はプライマリで実行した例
%SYS>set x=##class(SYS.Mirror).GetFailoverMemberStatus(.thismember,.othermember)
%SYS>zwrite thismember
thismember=$lb("MACHINEA","10.0.0.244|2188","Primary","Active","10.0.0.244|1972","10.0.0.244|1972")
%SYS>zwrite othermember
othermember=$lb("MACHINEB","10.0.0.151|2188","Backup","Active","10.0.0.151|1972","10.0.0.151|1972")
1.1) 自ノードがプライマリメンバーの場合、$list() の4番目に返される Status値には以下のような状態が返ります。
Active
Restart
Trouble
Failover
Recovery
Deciding
Exit
Inactive
1.2) 自ノードがメンバーのバックアップメンバーの場合、Statusには以下のような状態が返ります。
Active
Catchup
Restart
Trouble
Failover
Recovery
Deciding
Exit
Inactive
(2) 非同期メンバの状態を確認する
非同期メンバではAsyncDejournalStatus() の戻り値のStatusで確認します。
// 非同期DRで実行
%SYS>write ##class(SYS.Mirror).AsyncDejournalStatus("TESTMIRROR")
running
フェイルオーバ・バックアップメンバまたは非同期DRメンバでの遅延状態は、以下のクラスメソッドで確認できます。
戻り値が 1の場合は遅延はない状況となります。
%SYS>write ##class(SYS.Mirror).DistanceFromPrimaryJournalFiles()
1
%SYS>write ##class(SYS.Mirror).DistanceFromPrimaryDatabases()
1
また、以下のクラスメソッドは、遅延がある場合、その遅延時間(秒)を戻り値として返します。
%SYS>write ##class(SYS.Mirror).JournalFilesLatency()
0 // 遅延なし
%SYS>write ##class(SYS.Mirror).DatabasesLatency()
0 // 遅延なし
(3) ISCAgentの状態を確認する
ISCAgent が動作しているかどうかは、以下のように確認できます。
%SYS>write ##class(SYS.Agent).IsRunning()
1
(4) 定期的にミラーステータスを取得するサンプル(ツール)のご紹介
このツールでは、システムクラス SYS.Mirror のクエリMemberStatusList を使用しています。
do ##class(%ResultSet).RunQuery("SYS.Mirror","MemberStatusList") と同様の内容です。
%SYSネームスペースに、zmirrorstat.mac の名前で保存・コンパイルします。
Start(int,n,mirror) ;
do Header()
;
for i=1:1:n {
Do MirrorStatus(mirror)
Hang int
}
;
Quit
MirrorStatus(mirror) {
set rs=##class(%ResultSet).%New("SYS.Mirror:MemberStatusList")
set n=rs.GetColumnCount()
do rs.Execute(mirror)
while rs.Next() {
write $ZDATE($P($H,",",1)),",",$ZTIME($P($H,",",2)),","
for i=1:1:n Write rs.GetData(i) w:i'=n ","
write !
}
}
Header() {
set hd1="Date,Time"
write hd1,","
set rs=##class(%ResultSet).%New("SYS.Mirror:MemberStatusList")
set n=rs.GetColumnCount()
for i=1:1:n Write rs.GetColumnHeader(i) w:i'=n ","
write !
}
例:ミラー名:MIRRORTEST のステータスを、1秒おきに3回実行します
%SYS>do ^zmirrorstat(1,3,"TESTMIRROR")
Date,Time,Member Name,Current Role,Current Status,Journal Transfer Latency,Dejournal Latency,Journal Transfer Time Latency,Dejournal Time Latency,Display Type,Display Status
08/01/2025,11:17:26,MACHINEA,プライマリ,動作中,N/A,N/A,N/A,N/A,フェイルオーバー,プライマリ
08/01/2025,11:17:26,MACHINEB,バックアップ,動作中,動作中,キャッチアップ,動作中,キャッチアップ,フェイルオーバー,バックアップ
08/01/2025,11:17:26,MACHINEC,非同期,非同期,キャッチアップ,キャッチアップ,キャッチアップ,キャッチアップ,災害復旧,接続しました
08/01/2025,11:17:28,MACHINEA,プライマリ,動作中,N/A,N/A,N/A,N/A,フェイルオーバー,プライマリ
08/01/2025,11:17:28,MACHINEB,バックアップ,動作中,動作中,キャッチアップ,動作中,キャッチアップ,フェイルオーバー,バックアップ
08/01/2025,11:17:28,MACHINEC,非同期,非同期,キャッチアップ,キャッチアップ,キャッチアップ,キャッチアップ,災害復旧,接続しました
08/01/2025,11:17:29,MACHINEA,プライマリ,動作中,N/A,N/A,N/A,N/A,フェイルオーバー,プライマリ
08/01/2025,11:17:29,MACHINEB,バックアップ,動作中,動作中,キャッチアップ,動作中,キャッチアップ,フェイルオーバー,バックアップ
08/01/2025,11:17:29,MACHINEC,非同期,非同期,キャッチアップ,キャッチアップ,キャッチアップ,キャッチアップ,災害復旧,接続しました
%SYS>