記事
· 2026年1月9日 5m read

ミラーの現在の状態&情報をコマンドで確認する方法

これは InterSystems FAQ サイトの記事です。

ミラーの現在の状態は、管理ポータルのミラーモニタで確認できます。

こちらのトピックでは、それらの情報をコマンドで確認する方法をご紹介します。


(1) フェイルオーバメンバ(プライマリ・バックアップ)の状態を確認する

(2) 非同期メンバの状態を確認する

(3) ISCAgentの状態を確認する

(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>
ディスカッション (0)0
続けるにはログインするか新規登録を行ってください