Db2のアーカイブログとは?切り替わるタイミングとコピーの仕組みを解説

Db2

はじめに

Db2のログ管理では「アーカイブ」という言葉が頻繁に登場しますが、実際には2つの異なる動作を指しています。

・ログファイルがクローズされる
・クローズされたログがアーカイブ領域にコピーされる

この2つを区別できていないと、

・ログがいつ増えるのか分からない
・どこまでが削除可能なのか判断できない

といった問題につながります。

本記事では、アーカイブログの基本に加えて、

・ログが切り替わるタイミング
・コピーが実行されるタイミング
・オンラインアーカイブログの状態

を中心に、実務で使える形で整理します。

なお、ここではロギングにフォーカスをあてていますが、リカバリの視点としては以下の記事にまとめています。

Db2のログと回復管理とは?トランザクションログの仕組みと実務運用を解説


アーカイブログの基本構造

Db2では、ある時点で書き込み対象となるログは1つだけです。

このログを「カレントログ」と呼びます。

db2 "select FIRST_ACTIVE_LOG, CURRENT_ACTIVE_LOG from table(mon_get_transaction_log(-1)) as t"
項目意味
CURRENT_ACTIVE_LOG現在書き込み中のログ
FIRST_ACTIVE_LOGリカバリーに必要な最古のログ

ログは以下の流れで管理されます。

  1. カレントログに書き込み
  2. ログがクローズされる
  3. アーカイブ対象になる
  4. アーカイブ領域にコピーされる

ここで重要なのは、クローズとコピーは別のタイミングで発生するという点です。

この違いが、ログ管理の挙動を理解する上でのポイントになります。


カレントログがクローズされるタイミング

ログがアーカイブ対象になる最初の条件は「カレントログのクローズ」です。

主なタイミングは以下の通りです。

タイミング内容
ログ満了ファイルサイズ上限に達したとき
DB非活動化接続がすべて切断されたとき
オンラインバックアップバックアップ開始時に切り替え
ARCHIVE LOG 実行明示的にログを切り替える
WRITE SUSPEND書き込み停止時に切り替え

ここで重要な点があります。

ARCHIVE LOGコマンドは「コピー」ではなく、ログをクローズするためのコマンドです。

つまり、

・クローズされる
・アーカイブ対象になる

までは保証されますが、

・コピーが完了するとは限らない

という動きになります。


アーカイブ領域へコピーされる仕組み

ログファイルはクローズされた後、自動的にアーカイブ対象になります。

しかし、コピーは即時ではありません。

処理の流れは以下の通りです。

ステップ内容
1ログがクローズされる
2コピー対象として登録される
3非同期でアーカイブ領域にコピー
4コピー完了

ここでの重要ポイントは以下です。

コピーは非同期で実行される

そのため、

・クローズ済みでも未コピーのログが存在する
・コピー遅延が発生する

という状態が発生します。

コピー先は以下のパラメータで制御されます。

db2 get db cfg | grep LOGARCHMETH1

LOGARCHMETH1 = DISK:/archive/log

この設定により、ログは指定した領域へ順次コピーされます。

なお、コピー後のメンテナンスについては以下の記事で詳しく整理しています。

Db2のアーカイブログ削除とは?PRUNE HISTORYと自動削除の実務設計を解説


オンラインアーカイブログという状態

ログがクローズされてからコピーが完了するまでの間、そのログは「オンラインアーカイブログ」と呼ばれます。

この状態は以下の特徴を持ちます。

状態内容
書き込み終了カレントログではない
コピー待ち or コピー中アーカイブ処理中
削除不可リカバリー対象

この状態が重要になる理由は、ログ管理の詰まりに直結するためです。

例えばコピーが遅延すると、

・ログが解放されない
・新しいログが確保できない

といった影響が出ます。

ログの問題はディスク容量ではなく、コピーの遅延によって発生することがあるという点が実務上のポイントです。


アクティブログの範囲とログの再利用

ログファイルは、アーカイブ領域にコピーされた後もすぐに役割が終わるわけではありません。

Db2では、ログは一定範囲が「アクティブログ」として管理され続けます。

この範囲は、以下の値で確認できます。

db2 "select FIRST_ACTIVE_LOG, CURRENT_ACTIVE_LOG from table(mon_get_transaction_log(-1))"
項目意味
FIRST_ACTIVE_LOGリカバリーに必要な最も古いログ
CURRENT_ACTIVE_LOG現在書き込み中のログ

例えば、

・FIRST_ACTIVE_LOG = 10
・CURRENT_ACTIVE_LOG = 20

であれば、S0000010.LOG から S0000020.LOG までがアクティブログとして扱われます。

ここで重要なのは、ログの配置場所ではなく「Db2の管理状態」です。

・アーカイブ領域にコピーされている
・クローズされている

この状態であっても、アクティブログの範囲に含まれている限りは、Db2にとっては必要なログです。


ログファイルは役割を終えた後、削除されるのではなく再利用されます。

動きとしては以下の通りです。

ステップ内容
1ログがクローズされる
2アーカイブ領域にコピーされる
3アクティブログ範囲から外れる
4ログファイルがリネームされる
5新しいログとして再利用される

この仕組みにより、ログファイルは循環的に使用されます。

そのため、ログ管理では

・どのログが現在使用中か
・どこまでがアクティブログか

を把握することが重要になります。

単純に「ファイルが存在しているかどうか」ではなく、
Db2の内部状態で判断する必要があるという点が実務上のポイントです。


まとめ

Db2のアーカイブログは、2つの動作を分けて理解することが重要です。

・ログがクローズされる
・アーカイブ領域へコピーされる

そして、

・コピーは非同期で行われる
・コピー完了前はオンラインアーカイブログになる

という流れで管理されています。

さらに、

・アクティブログの範囲で管理される
・ログは再利用される

という仕組みを理解することで、ロギングの全体像が明確になります。

トランザクションログは単なる履歴ではなく、リカバリーの前提となるデータです。

バックアップとリカバリーについては、以下の記事も参考になります。

Db2のバックアップとリカバリーとは?取得方式と運用設計の基本を解説

コメント

タイトルとURLをコピーしました