記事
· 2023年5月26日 6m read

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=2000

USERネームスペースは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 と入力して、リターンしてください。

ディスカッション (0)1
続けるにはログインするか新規登録を行ってください