DB2 for i のテーブル他テストライブラリー一式を他システムへコピーしようとしました。不要なジャーナルレシーバー(DBログ)が多数あるため、DLTJRNRCVコマンドで削除しようとしたところCPF7023が出てジャーナルレシーバーを削除できません。
上記の原因は、ジャーナルレシーバーは前後関係を保持しており、削除しようとしたジャーナルレシーバー(上記例ではJRNRCV0002)よりも古いジャーナルレシーバーが存在しているためです。ジャーナルレシーバーを削除する際は古い順に削除する必要があります。
※一昔前はジャーナルレシーバーの順番に関わらず任意のジャーナルレシーバーを削除できていました。
環境の確認
上記のサンプルでは下記のようにジャーナルレシーバーが数十個あります。
このサンプルではシステムによる自動ネーミングで番号が増えているように見えるのでJRNRCV0001を削除すればいいように見えますが、実はこれ以前にもう一つ古いジャーナルレシーバーが存在しました。(最初のジャーナルを作成した際、ユーザーがCRTJRNRCVコマンドでJRNRCV01という名前で作成しており、そのジャーナルレシーバーが一杯になった後にシステムによってJRNRCV0001 が作成されたため。JRNRCV0001は2番目に古いジャーナルレシーバーでした。)
ジャーナルレシーバーの確認方法:
ジャーナルに接続されたジャーナルレシーバーを検索する
例)ジャーナル GOMALIB/JRN0に関連したジャーナルレシーバーの一覧を取得する
SELECT JOURNAL_RECEIVER_LIBRARY, JOURNAL_RECEIVER_NAME, STATUS
FROM QSYS2.JOURNAL_RECEIVER_INFO
WHERE
JOURNAL_NAME = 'JRN01'
AND JOURNAL_LIBRARY = 'GOMALIB';
*** 上図の STATUS 欄の意味はこちら
現在の日本語サイトは自動翻訳で本来無用な語句まで日本語化されてます(^^;、
正しいSTATUSパラメーターは下記です。
接続 = ATTACHED
保留 = SAVED
解放 = FREED
部分 = PARTIAL
空 = EMPTY
ジャーナルレシーバーの順番を確認する方法は?
通常はこのサンプルのようにシステムが連番でジャーナルレシーバーを切り替えてくれるのであまり意識しないと思います。がマニュアル操作でジャーナルレシーバー名を指定・切替しているケースもあると思います。その場合、ジャーナルレシーバーの順番を確認する必要が出てきます。
方法① 自分自身の前後のジャーナルレシーバー名を検索する
QSYS2.JOURNAL_RECEIVER_INFOビューの下記のカラムにジャーナルレシーバーの前後の情報が記録されているのでこれを調べます。
PREVIOUS_JOURNAL_RECEIVER : 自分自身の1つ前のジャーナルレシーバー名
NEXT_JOURNAL_RECEIVER : 自分自身の1つ後のジャーナルレシーバー名
例
SELECT JOURNAL_RECEIVER_LIBRARY, JOURNAL_RECEIVER_NAME, STATUS, PREVIOUS_JOURNAL_RECEIVER
FROM QSYS2.JOURNAL_RECEIVER_INFO
WHERE JOURNAL_NAME = 'JRN01'
AND JOURNAL_LIBRARY = 'GOMALIB'
ORDER BY PREVIOUS_JOURNAL_RECEIVER ;
上記は、PREVIOUS_JOURNAL_RECEIVER(自分の前のジャーナルレシーバー名)でソートした例ですが、ジャーナルレシーバー名では命名ルールによっては必ずしも古い順番に並ばないことが発生しますね。
方法② ジャーナルレシーバーの接続時刻を確認する
上記と同様にジャーナルレシーバーの接続されていた時刻を調べソートすることでも確認できると思います。
例)
SELECT JOURNAL_RECEIVER_LIBRARY, JOURNAL_RECEIVER_NAME, STATUS, ATTACH_TIMESTAMP
FROM QSYS2.JOURNAL_RECEIVER_INFO
WHERE JOURNAL_NAME = 'JRN01'
AND JOURNAL_LIBRARY = 'GOMALIB'
ORDER BY ATTACH_TIMESTAMP ;
ATTACH_TIMESTAMP : ジャーナルレシーバーを接続した時刻
DETACH_TIMESTAMP : " 切断した時刻
やはりタイムスタンプの方が順番にソートする目的では適しているようです。期待した結果が得られました。
おまけ:カラム名をコピーする方法
ここまで長いカラム名を書くのが面倒、ということでACSの画面からコピーする方法です。
(参考)
一番最初のジャーナルレシーバーを検索する方法 : PREVIOUS_JOURNAL_RECEIVER IS NULL で検索
PREVIOUS_JOURNAL_RECEIVERカラムには自分自身の一つ前のジャーナルレシーバーの名前が入りますので一番最初のジャーナルレシーバーはNULLが入ります。
例)GOMALIBのジャーナル JRN01の最初のジャーナルレシーバーを検索。
SELECT *
FROM QSYS2.JOURNAL_RECEIVER_INFO
WHERE STATUS = 'ONLINE'
AND JOURNAL_NAME = 'JRN01'
AND JOURNAL_LIBRARY = 'GOMALIB'
AND PREVIOUS_JOURNAL_RECEIVER IS NULL ;
現在アクティブな=最新の ジャーナルレシーバーを検索する方法 : QSYS2.JOURNAL_INFO ビュー
例) GOMALIBのジャーナル JRN01に接続されている最新のジャーナルレシーバーを検索する
SELECT * FROM QSYS2.JOURNAL_INFO
WHERE JOURNAL_NAME = 'JRN01'
AND JOURNAL_LIBRARY = 'GOMALIB';
5250画面でジャーナルレシーバーを検索・削除する : WRKJRNコマンド
1.WRKJRNコマンドを実行
WRKJRN GOMALIB/JRN01
上記画面では古い順番に表示されますので、今回のケースでは一番上のジャーナルレシーバーから順にDLTJRNRCVコマンドを実行すればOKです。