記事
· 2021年8月31日 5m read

ジャーナルファイルが長時間消されずに残ってしまう原因

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

24時間停止しないシステムの場合、「ジャーナルファイルの削除設定」に合わせて 0時30分 に古いジャーナルファイルを削除します。

「ジャーナルファイルの削除設定」より古いジャーナルファイルが残っている原因として、オープンされたままのトランザクションが存在していることが考えられます。

その場合、トランザクション実行中プロセスを探し、トランザクションを確定させることでジャーナルファイルを削除できるようになります。

以下のサンプルは、オープンされたままのトランザクションの存在確認と、存在する場合は対象ファイル名とジャーナルレコード情報が出力されます。

(サンプルは、https://github.com/Intersystems-jp/CheckOpenTransaction からダウンロードできます)

※注意※
確認対象のジャーナルファイルサイズが大きい場合、ジャーナルファイルが多数ある場合は、実行に時間がかかるため、弊社サポートセンターまでご連絡ください。

Class ISJ.JournalUtility
{
ClassMethod GetOpenTransaction() As %Status
{
    set status=$$$OK
    #dim ex As %Exception.AbstractException
    #dim rset As %ResultSet
    try {
        //現在のジャーナルファイル
        write !,"現在のジャーナルファイル名:",
            ##class(%SYS.Journal.System).GetCurrentFileName(),!!         // Open中トランザクション調査
        // WIJに記録されているジャーナルの情報を取得
        $$$ThrowOnError(##class(%SYS.Journal.System).GetImageJournalInfo(.filename,.jrnoffset,.jrnfilecount,.opentranoffset,.opentranfilecount))
        if $get(opentranoffset)="" {
            write !,"オープン中トランザクションはありません",!
            return status
        }         //ファイルカウントに差(jrnfilecount-opentranfilecount>0 )がある場合
        // 古いジャーナルファイルにオープン中トランザクションがあるため、対象ファイル名を探す
        if jrnfilecount-opentranfilecount>0 {
            set loopcnt=jrnfilecount-opentranfilecount
            for i=1:1:loopcnt {
                set currentfile=filename
                $$$ThrowOnError(##class(%SYS.Journal.File).GetPrev(currentfile,.filename))
            }
        }         write "〇〇 オープン中の対象ジャーナルレコード一覧 〇〇",!
        set rset=##class(%ResultSet).%New("%SYS.Journal.Record:List")
        do rset.%Execute(filename,,,,$LB("Address","=",opentranoffset))
        write !,"=== File Name : ",filename," ===",!
        write "Address : TimeStamp : ProcessID : RemoteSystemID : TypeName : Transaction",!
        while rset.%Next() {
            write rset.%Get("Address")," : ",
                rset.%Get("TimeStamp")," : ",
                rset.%Get("ProcessID")," : ",
                rset.%Get("RemoteSystemID")," : ",
                rset.%Get("TypeName")," : ",
                rset.%Get("InTransaction"),!
        }
    }
    catch ex {
        set status=ex.AsStatus()
    }
    return status
}
}

 

実行例は以下の通りです。

USER>do ##class(ISJ.JournalUtility).GetOpenTransaction()

現在のジャーナルファイル名:/usr/irissys/mgr/journal/20210330.002

〇〇 オープン中の対象ジャーナルレコード一覧 〇〇

=== File Name : /usr/irissys/mgr/journal/20210330.001 ===
Address : TimeStamp : ProcessID : RemoteSystemID : TypeName : Transaction
1834156 : 2021-03-30 13:19:00 : 5194 : 1073741824 : BeginTrans : 1

 

関連する記事もご参照ください。

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