はじめに
以前、Qレプリケーション(以降、QREP)に関わり、その中で、QREP構築中に出たエラーを思い出して、再現と対応について確認してみました。
本記事では、Db2のアーカイブログが削除されてしまい、QREPの起動が失敗した時のことを記載します。
Db2のことはまだ慣れていないため、設定や動作を確認しながら進めていきます。
Db2のアーカイログ消失
QREPのCaptureプログラムは起動時にDb2のログからINSERT・UPDATE・DELETE などの変更履歴を読み取ります。
そのため、前回停止した位置からDb2のログを読み込もうとした際に、そのポイントのログが存在しない場合、エラーとなって起動が失敗してしまいます。
例えば、QREP(Qキャプチャー)をしばらく停止にしている中で、Db2のアーカイブログを定期的ログローテートしている場合、Qキャプチャーを久しぶりに起動したとき、前回の続きのログが無くなっているというケースが考えられます。
エラーの再現してみる
アーカイブログの設定についての確認と、単純にログが無い状態でQキャプチャー起動をしてみました。
1. Db2の設定事前準備:アーカイブログの設定
アーカイブ先ディレクトリ作成します。
mkdir /db2arch/
chmod 775 /db2arch/
chown db2inst1:db2iadm1 /db2arch/
次に作成したディレクトリをLOGARCHMETH1に指定します。
db2 update db cfg for SAMPLE using LOGARCHMETH1 DISK:/db2arch/
設定値確認
$ db2 get db cfg for SAMPLE | grep -i LOGARCHMETH1
第 1 ログ・アーカイブ・メソッド (LOGARCHMETH1) = DISK:/db2arch/
logarchmeth1 のアーカイブ圧縮 (LOGARCHCOMPR1) = OFF
logarchmeth1 のオプション (LOGARCHOPT1) =
現在のアクティブログ番号を確認します。
$ db2pd -db sample -logs
Database Member 0 -- Database SAMPLE -- Active -- Up 0 days 00:02:58 -- Date 2025-11-14-23.29.37.233076
Logs:
Current Log Number 13
Pages Written 0
Cur Commit Disk Log Reads 0
Cur Commit Total Log Reads 0
Method 1 Archive Status Success
Method 1 Next Log to Archive 13
Method 1 First Failure n/a
Method 2 Archive Status n/a
Method 2 Next Log to Archive n/a
Method 2 First Failure n/a
Extraction Status n/a (0)
Extraction Throttle Reason n/a
Current Log to Extract n/a
Log Chain ID 0
Current LSO 101900047
Current LSN 0x000000000006AF34
Address StartLSN StartLSO State Size Pages Filename
0x00007F345BB807D0 000000000006AF25 93748001 0x00000000 1000 1 S0000011.LOG
0x00007F345BB81130 000000000006AF31 97824001 0x00000000 1000 1 S0000012.LOG
0x00007F345BB7F630 000000000006AF33 101900001 0x00000000 1000 1000 S0000013.LOG
Current Log Number で13番であることが確認できました。
次に強制的にアーカイブをしてみます。
$ db2 archive log for database sample
すると、アーカイブ先に13番のログがコピーされていました。
ls -l /db2arch/db2inst1/SAMPLE/NODE0000/LOGSTREAM0000/C0000000
S0000013.LOG
2. ログ削除とQキャプチャー起動確認
前回のQキャプチャー停止時に以下のログが出ていたとします。
ASN7156I "Q Capture" : "ASN" : "WorkerThread" : Q キャプチャー・プログラムは、ログ・ファイル "/home/db2inst1/db2inst1/NODE0000/SQL00002/LOGSTREAM0000/S0000007.LOG" のログ・レコードの処理を停止しました。
この状態でQキャプチャーを起動すると前回の続きで7番のログから読み始めると想像できます。
そのため、この7番のアーカイブログを削除して、Qキャプチャーを起動してみます。
<logrdDB2LUW::readTheLog> ASN0552E "Q Capture" : "ASN" : "logrd" : プログラムは、SQL エラーを検出しました。 サーバー名は、"SAMPLE"。 SQL 要求は次の通りです。"db2ReadLog". 表名は ""。 SQLCODE は "-2657"。 SQLSTATE は " "。 SQLERRMC は "S0000007.LOG�0"。 SQLERRP は "SQLPRLOG"。
SQL2657N ログ・リーダーは、ログ・ストリーム "0" の中で "S0000007.LOG" という名前のログ・ファイルを検出できないため、ログ読み取り操作は失敗しました。
<logrdDB2LUW::readTheLog> ASN0005E CAPTURE "ASN" : "LogrdThread". キャプチャー・プログラムが、データベース・ログの読み取り中に、エラーを検出しました。 ログの シーケンス番号は "0000:0000:0000:22DF:0000:0000:0005:A942"、SQLCODE は "-2657"、理由コードは "" です。
ログを確認すると、"S0000007.LOG" という名前のログ・ファイルを検出できないという理由でエラーとなっています。
一方コールドスタートは可能か試してみます。
<handleLogrdInitMsg> ASN7155I "Q Capture" : "ASN" : "WorkerThread" : Q キャプチャー・プログラムがログ・ファイル "/home/db2inst1/db2inst1/NODE0000/SQL00002/LOGSTREAM0000/S0000014.LOG" のログ・レコードの処理を開始しました。
現在のアクティブログは14番まで進んでおり、14番のログは残っていたため、コールドスタートは可能でした。
ただし、現在のログ位置からの開始のため、消失分以降のログは取り込めず、データが不整合となる可能性があります。
では、現在のアクティブ・ログが、18番と仮定して、Db2のログを再読み込みする位置も18番のログである場合はどうなるかを確認してみました。結果、この18番のログが消失するとコールドスタートも不可能でした。
<logrdDB2LUW::readTheLog> ASN0552E "Q Capture" : "ASN" : "logrd" : プログラムは、SQL エラーを検出しました。 サーバー名は、"SAMPLE"。 SQL 要求は次の通りです。"db2ReadLog". 表名は ""。 SQLCODE は "-2657"。 SQLSTATE は " "。 SQLERRMC は "S0000018.LOG�0"。 SQLERRP は "SQLPRLOG"。
SQL2657N ログ・リーダーは、ログ・ストリーム "0" の中で "S0000018.LOG" という名前のログ・ファイルを検出できないため、ログ読み取り操作は失敗しました。
このような場合はリストアするしかないでしょうか。
(他は思いつきませんでした。。。)
さいごに
今回はアーカイブログの設定方法の確認も兼ねて、キャプチャー・プログラムの起動時にトランザクションログの先頭ファイルが見つからない場合のエラーメッセージを確認してみました。
普通に運用していれば、ログを誤って削除することはないと思うのですが、ログメンテナンス等で続きが消えてしまった場合などの可能性が考えられるため、そのような場合に、QREPとしては何ができるのかを確認してみました。
結果、よい解決方法を見つけることはできませんでした。
不甲斐ないですが、ご参考までに。