はじめに
この記事では、IBM Db2のTransaction Logの内部実装を深掘りします。
InnoDB、PostgreSQL、Oracle、SQL Serverに続くシリーズ最終回です。Db2のTransaction Logは2つのロギングモード(Circular / Archive)を持つのが特徴的です。Db2 11.5を中心に、以下を解説します:
- Transaction Logの役割
- Log Record(記録の単位)
- ログファイルの物理構造(Primary Log / Secondary Log)
- Circular LoggingとArchive Logging
- Log Bufferと書き込みの仕組み
- Soft Checkpoint
そもそもDb2 Transaction Logって何?
他の4つのDBと同じくWALの原則に従います。データページを変更する前にログをディスクに書き、クラッシュ時にリカバリできるようにします。
Db2の用語で整理すると:
Db2用語 InnoDB用語 PostgreSQL用語 Oracle用語 SQL Server用語
──────────────────────────────────────────────────────────────────────────────────────────────
Transaction Log REDO Log WAL REDO Log Transaction Log
LSN (Log Sequence LSN LSN SCN LSN
Number)
Log Buffer Log Buffer WAL Buffer Redo Log Buffer Log Buffer
db2loggw log_writer バックエンド自身 LGWR Log Writer
Primary Log ib_logfile0/1 WALセグメント Online Redo Log .ldfファイル
Archive Log ― WALアーカイブ Archived Redo Log ログバックアップ
Db2のLSNはInnoDBやPostgreSQLと同様に、ログ内の物理的なバイトオフセットです。
Log Recordの構造
Db2のLog Recordは他のDBと同様に、各操作の変更内容を記録します。
Log Recordの種類
主要なLog Record Type:
| Type | 説明 |
|---|---|
| Normal | データ変更(INSERT/UPDATE/DELETE) |
| Compensation | ロールバック時のUNDO操作の記録(CLR) |
| Nontransactional | トランザクション外の操作(スペース管理など) |
SQL Serverと同様に、Db2もREDO情報とUNDO情報を同じTransaction Logに記録します。
| InnoDB | PostgreSQL | Oracle | SQL Server | Db2 | |
|---|---|---|---|---|---|
| UNDO | 別ファイル | テーブル内 | 別領域 | 同じログ | 同じログ |
Compensation Log Record(CLR)
ロールバック時、Db2はUNDO操作自体もログに記録します。これがCLR(Compensation Log Record)です。ARIESアルゴリズムの標準的な実装です。
正常時:
LSN 100: BEGIN
LSN 200: INSERT (row A) ← REDO: insert, UNDO: delete
LSN 300: UPDATE (row B) ← REDO: update, UNDO: old value
ロールバック時:
LSN 400: CLR for LSN 300 ← row Bを元に戻す(UNDOのREDO)
LSN 500: CLR for LSN 200 ← row Aを削除(UNDOのREDO)
LSN 600: ROLLBACK
CLRがあることで、ロールバック中にクラッシュしても、CLRをリプレイするだけで正しい状態に復元できます。
db2readlogで実際に見てみる
$ db2readlog -f logfile.log
LSN: 0x000000001000 Type: Normal TxnID: 0x0000000003
Redo: INSERT into TABLE1 ...
Undo: DELETE from TABLE1 ...
LSN: 0x000000001200 Type: Normal TxnID: 0x0000000003
Redo: COMMITログファイルの物理構造
Primary LogとSecondary Log
Db2のログファイルはPrimary LogとSecondary Logの2種類があります。
Primary Log(事前確保):
S0000000.LOG S0000001.LOG S0000002.LOG ... S000000N.LOG
↑ LOGPRIMARY パラメータで数を指定
Secondary Log(必要時に動的作成):
S000000X.LOG S000000Y.LOG ...
↑ LOGSECOND パラメータで最大数を指定
-- 設定確認
db2 get db cfg for mydb | grep -i log
Log file size (4KB) (LOGFILSIZ) = 1024
Number of primary log files (LOGPRIMARY) = 13
Number of secondary log files (LOGSECOND) = 12
Path to log files = /db2/logs/mydb/- LOGFILSIZ:各ログファイルのサイズ(4KBページ単位)
- LOGPRIMARY:Primary Logの数(DB起動時に事前作成)
- LOGSECOND:Secondary Logの最大数(Primary Logが足りないとき動的作成)
Primary Logが全部使われるとSecondary Logが作られます。Secondary Logも使い切るとログフル(log full)エラーになります。
各DBのファイル管理比較
| InnoDB | PostgreSQL | Oracle | SQL Server | Db2 | |
|---|---|---|---|---|---|
| 方式 | 固定ファイル循環 | セグメント作成/削除 | グループ循環 | VLF(ファイル内区画) | Primary + Secondary |
| 事前確保 | あり | なし | あり | あり | Primaryのみ事前確保 |
| 動的拡張 | なし | あり | なし | あり(自動拡張) | Secondaryで動的拡張 |
Circular LoggingとArchive Logging
Db2の最大の特徴は、2つのロギングモードを明確に分けている点です。
Circular Logging(デフォルト)
ログファイルを循環的に再利用します。不要になったログは自動的に上書きされます。
S0000000.LOG → S0000001.LOG → S0000002.LOG → S0000000.LOG → ...
(上書き) ↑ 循環
- PITR(Point-in-Time Recovery)は不可
- クラッシュリカバリのみ可能
- ログファイルが肥大化しない
- 開発/テスト環境向け
SQL ServerのSIMPLE Recovery Modelに相当します。
Archive Logging
ログファイルを上書きせず、アーカイブ先に保存します。
-- Archive Loggingに切り替え
db2 update db cfg for mydb using LOGARCHMETH1 DISK:/db2/archlog/
-- DB再起動が必要
db2 deactivate db mydb
db2 activate db mydbActive Log:
S0000000.LOG → S0000001.LOG → S0000002.LOG
↓ 不要になったらアーカイブ
Archive Log:
/db2/archlog/S0000000.LOG
/db2/archlog/S0000001.LOG
- PITRが可能
- オンラインバックアップが可能
- 本番環境向け
- ログの管理(削除)は運用者の責任
各DBのログ保持方針比較
| InnoDB | PostgreSQL | Oracle | SQL Server | Db2 | |
|---|---|---|---|---|---|
| 循環/最小 | 固定ファイル循環 | wal_level=minimal | NOARCHIVELOG | SIMPLE | Circular |
| アーカイブ/完全 | binlog | archive_mode=on | ARCHIVELOG | FULL | Archive |
| デフォルト | 循環 | アーカイブなし | NOARCHIVELOG | SIMPLE | Circular |
Log Bufferと書き込み
Log Buffer
Db2のLog Bufferはデータベース共有メモリ内にあります。
-- Log Bufferサイズの確認・設定
db2 get db cfg for mydb | grep LOGBUFSZ
Log buffer size (4KB) (LOGBUFSZ) = 256
-- デフォルト256ページ = 1MB書き込みの流れ
Db2はOracleやSQL Serverと同様に、専用プロセス(db2loggw)がディスクへの書き込みを担当します:
1. エージェントスレッド
├─ Log Recordを生成
├─ Log Bufferにコピー
└─ コミット時にdb2loggwに通知
2. db2loggw(Log Writer)
├─ Log Bufferからログファイルにwrite + fsync
└─ 以下のタイミングで起動:
├─ コミット時
├─ Log Bufferが一定量埋まったとき
└─ 定期的
MINCOMMIT:Group Commitの制御
Db2にはMINCOMMITというユニークなパラメータがあります:
db2 get db cfg for mydb | grep MINCOMMIT
Number of commits to group (MINCOMMIT) = 1MINCOMMIT = 1(デフォルト)では、コミットごとにすぐfsyncします。値を大きくすると、指定数のコミットが溜まるまでfsyncを遅延させ、Group Commitの効果を高めます。
| 設定 | 挙動 | 他DBの対応 |
|---|---|---|
| MINCOMMIT = 1 | 即座にfsync | InnoDB = 1、PostgreSQL on |
| MINCOMMIT > 1 | N個溜まるまで待つ | Db2固有 |
Soft Checkpoint
Db2のCheckpoint方式
Db2のCheckpointはSoft Checkpointと呼ばれます。OracleのIncremental CheckpointやSQL ServerのIndirect Checkpointに近い考え方です。
Soft Checkpointでは: 1. Checkpoint開始時点のLSNを記録 2. ダーティページのフラッシュはPage Cleanerが非同期で常時実行 3. Checkpointは「ここまでのダーティページはフラッシュ済み(または進行中)」という位置を記録
-- Checkpointの間隔(デフォルト: 自動)
db2 get db cfg for mydb | grep SOFTMAX
Percent log file reclaimed before soft chkpt (SOFTMAX) = 520SOFTMAXはPrimary Logの何%が消費されたらSoft Checkpointを発行するかを制御します。
各DBのCheckpoint比較(最終版)
| InnoDB | PostgreSQL | Oracle | SQL Server | Db2 | |
|---|---|---|---|---|---|
| 方式 | 軽い(LSN記録) | 重い(全ページフラッシュ) | Incremental | Indirect | Soft Checkpoint |
| ダーティページフラッシュ | Page Cleaner | Checkpointer + BGWriter | DBWn | Background | Page Cleaner |
| I/O特性 | 平準化 | スパイクあり | 平準化 | 平準化 | 平準化 |
まとめ:REDO/WALシリーズ全体比較
| トピック | InnoDB | PostgreSQL | Oracle | SQL Server | Db2 |
|---|---|---|---|---|---|
| 名称 | REDO Log | WAL | REDO Log | Transaction Log | Transaction Log |
| 順序管理 | LSN(物理) | LSN(物理) | SCN(論理) | LSN(3部構成) | LSN(物理) |
| UNDO | 別ファイル | テーブル内 | 別領域 | 同じログ | 同じログ |
| Partial Write対策 | Double Write Buffer | Full Page Write | 512Bブロック + Checksum | Torn Page Detection / Checksum | 512Bブロック + Checksum |
| 記録単位 | 1ページ限定 | 複数ページ可 | 複数ブロック可 | 行単位 | 行単位 |
| ファイル管理 | 固定ファイル循環 | セグメント作成/削除 | グループ循環 | VLF | Primary + Secondary |
| 書き込み主体 | 専用スレッド | 各バックエンド | LGWR | Log Writer | db2loggw |
| 並列化 | Lock-free | LWLock | Private Redo Strand | Spinlock | ― |
| Checkpoint | 軽い | 重い | Incremental | Indirect | Soft |
| ログ保持 | 循環 | アーカイブ設定 | ARCHIVELOG | Recovery Model | Circular / Archive |
5つのDBを比較すると、WALの基本原則(変更前にログを書く)は共通ですが、実装のアプローチは多様です:
- InnoDB:MySQL 8.0のLock-free設計が最も先進的。ただしUNDOは別管理
- PostgreSQL:シンプルな設計。Full Page WriteでWALだけで完結する潔さ
- Oracle:最も成熟した運用機能(グループ/メンバー、アーカイブ)
- SQL Server:REDO/UNDOの統合とVLFが独特。Recovery Modelが明快
- Db2:Circular/Archiveの明確な分離。Primary/Secondaryの2段構えが堅実
どのDBも「ディスクの順次書き込み性能を最大限活用しつつ、クラッシュからデータを守る」という同じゴールに向かって、それぞれの歴史と設計思想を反映した実装になっています。