IRISジャーナル(z圧縮済み)をCachéにリストアする方法
これは InterSystems FAQ サイトの記事です。
IRISではジャーナルファイルが自動的に圧縮される仕組みが導入されています。
ジャーナルファイルの圧縮機能について詳しくは、別の記事「ジャーナル圧縮機能について」をご参照ください。
例えば、CachéからIRISへ移行された後に、念のためIRISで更新されたデータを手動でCachéにも反映させたいことばある場合に、IRISのジャーナルファイルをCachéにリストアすることができます。
手順は以下の通りです。
(手順1) IRISのジャーナルファイル(YYYYMMDD.nnnz) ファイルを解凍する
(手順2,3) 解凍した ジャーナルファイルを Cachéに転送してリストアする
リストアの方法として、以下の2パタンをご紹介
(A) 指定グローバルとデータベースについて、指定ジャーナルから、全エントリをリストア
(B) 指定グローバルとデータベースについて、指定ジャーナルから、特定のアドレスまでリストアする
(A) 指定グローバルとデータベースについて、指定ジャーナルから、全エントリをリストア
(手順1) IRISサーバ上で以下のコマンドにより、ジャーナルを解凍する
IRIS 2022.1 以降、現在実行中のジャーナル以外は、拡張子 z で圧縮されています。
以下のコマンドで解凍し、指定のフォルダにコピーします。
これをCachéにリストアしたいジャーナルファイルすべてに対して繰り返し実行してください。
例)
set j1="/usr/irissys/mgr/journal/20230413.002z"
set j2="/temp/20230413.002"
write ##class(%SYS.Journal.File).Decompress(j1,j2)
set j1="/usr/irissys/mgr/journal/20230413.003z"
set j2="/temp/20230413.003"
write ##class(%SYS.Journal.File).Decompress(j1,j2)以下の実行例では、リストア対象データを作成しています。
USER>set ^abc="Dummyデータ"
USER>set ^test1="USERデータベースで登録( I R I S )"
USER>set $namespace="test1"
TEST1>set ^Dummy=11000
TEST1>set ^DummyXX=2000USERネームスペースはUSERデータベースにグローバルがセットされ、USERデータベースディレクトリは「/usr/irissys/mgr/user/」です。
TEST1ネームスペースはTEST1データベースにグローバルがセットされ、TEST1データベースディレクトリは「/usr/irissys/mgr/test1/」です。
(手順2) 手順1で解凍した、リストアしたいジャーナルを、すべて Cachéサーバに転送します。
(手順3) Cachéサーバ上で、上記コピーしてきたジャーナルを、連続してリストアします。
IRISからコピーして /temp に置いた 20230413.002 と 20230413.003 ファイルを以下のルールでリストアするように指定します。
[IRIS]/usr/irissys/mgr/user/ → [Cache]/usr/cachesys/mgr/user/ : ^abc と ^test1をリストア対象に指定する
[IRIS]/usr/irissys/mgr/test1/ → [Cache]/usr/cachesys/mgr/test1/ : ^Dummy と ^DummyXXをリストア対象に指定する
実行コードは以下の通りです。
注意:Windows以外のOSにリストアする場合、データベースディレクトリの末尾にパスのマーク(/)を必ず入れて下さい。
//ジャーナルリストアに利用するクラスのインスタンスを生成
set jrn=##class(Journal.Restore).%New()
//リストア開始ファイルの指定
set jrn.FirstFile="20230413.002"
//リストア終了ファイルの指定
set jrn.LastFile ="20230413.003"
//ジャーナルファイルの配置場所
do jrn.UseJournalLocation("/home/isjedu/irisjrn/")
//カレントインスタンスのジャーナルログファイルを使うかどうか(-1は使わない)
set jrn.JournalLog=-1
//ジャーナルリストア終了時、コミットされてないトランザクションをロールバックするかどうか
set jrn.RollBack=0
//1つ目のデータベース
set src(1)="/usr/irissys/mgr/user/"
set to(1)="/usr/cachesys/mgr/user/"
//第1引数:IRISのデータベースのデータベースディレクトリ
//第2引数:リストア対象グローバル変数名(前方一致可)
//IRISのUSERデータベースにある ^abcと、^iijimaをリストア
do jrn.SelectUpdates(src(1),"abc") //^abc
do jrn.SelectUpdates(src(1),"test1") //^test1
//ジャーナルリストア対象データベースディレクトリのリダイレクト指定
//第1引数:ジャーナルに記録されているIRISのデータベースディレクトリ
//第2引数:リストア対象のCacheのデータベースディレクトリ
set status=jrn.RedirectDatabase(src(1),to(1))
//もしエラーがあったらエラー情報を出力して終了
if $$$ISERR(status) {
write $system.Status.GetErrorText(status)
quit
}
//2つ目のデータベース
set src(2)="/usr/irissys/mgr/test1/"
set to(2) ="/usr/cachesys/mgr/test1/"
do jrn.SelectUpdates(src(2),"Dummy*") ;; ^Dummy ^DummyXX
set status=jrn.RedirectDatabase(src(2),to(2))
if $$$ISERR(status) {
write $system.Status.GetErrorText(status)
quit
}
//n個目のデータベース
/*
set src(n)="..(IRISのDBフォルダ名).."
set to(n) ="..(CacheのDBフォルダ名).."
do jrn.SelectUpdates(src(n),"xxx*") // ^xxx
do jrn.SelectUpdates(src(n),"yyy") // ^yyy
set status=jrn.RedirectDatabase(src(n),to(n))
if $$$ISERR(status) {
write $system.Status.GetErrorText(status)
quit
}
*/
//リストア実行
set status=jrn.Run()
if $$$ISERR(status) {
write $system.Status.GetErrorText(status)
quit
}
(B) 指定グローバルとデータベースについて、指定ジャーナルから、特定のアドレスまでリストア
(手順1)(手順2)は、(A)と同様です。
(手順3) Cachéサーバ上で、上記コピーしてきたジャーナルを、連続してリストアします。
指定アドレス以降はリストアしない、というフィルタルーチンを、Caché サーバの %SYS に作成します。ルーチンの引数名はそのままにしておいてください。
作成詳細は、別記事「誤って削除したグローバルを復旧させる方法」の実施例以下をご覧ください。
%SYSネームスペースにルーチン名:ZJRNFILT で作成します。
例)
ZJRNFILT(pid,dir,glo,type,restmode,addr,time)
set restmode=1
// グローバル変数名に TEST1 が含まれいる
// かつ ジャーナルレコードが9060180以降は restmode=0 に設定(=リストアしない)
if (glo [ "TEST1") & (addr>=9060180) {
set restmode=0
}
quit(A)の手順のRun()メソッド実行の直前にフィルタルーチンの名称を設定する1文を加えるだけです。
//実行
set jrn.Filter="^ZJRNFILT" ;; <--- フィルタルーチン指定
set status=jrn.Run()実行すると、ジャーナルをリストア完了後、以下のように2回聞かれます。
Do you want to rename your journal filter?
Do you want to delete your journal filter?
どちらも N と入力して、リターンしてください。