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") //^abcdo 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 ^DummyXXset 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 と入力して、リターンしてください。