【わる】

WAL(Write-Ahead Log) とは?

💡 本番に書く前に、まずメモに書いておく安心設計
📌 このページのポイント
WAL(Write-Ahead Log)の仕組み アプリ UPDATE ... Step 1 WALログ 変更内容を先に記録 (追記のみ・高速) Step 2 データ本体 後からまとめて 反映 障害発生時 WALログを再生(リプレイ)→ データ本体を復旧 追記のみで高速書き込み 障害復旧が確実
WALのイメージ
ひよこ ひよこ

WALって何?データベースのログのこと?

ペンギン先生 ペンギン先生

ログの一種だけど、特別なルールがあるんだ。「データベース本体を書き換える前に、必ず先にログファイルに変更内容を記録する」というルールだよ。これが Write-Ahead(先に書く)の意味だね

ひよこ ひよこ

なんで先にログに書く必要があるの?

ペンギン先生 ペンギン先生

もしデータベース本体への書き込み中に停電やクラッシュが起きたら、データが中途半端な状態になるよね。でもログに先に記録しておけば、再起動後にログを見て「ここまで書いたから、続きを反映しよう」って復旧できるんだ

ひよこ ひよこ

なるほど!でも毎回ログに書いてから本体にも書くって、二度手間で遅くならないの?

ペンギン先生 ペンギン先生

実は逆で速くなることが多いんだ。ログは追記(末尾に書き足す)だけだからディスクの動きが少なくて高速なんだよ。本体へのランダムな書き込みは後でまとめてやれるから、全体としては効率が良くなるよ

ひよこ ひよこ

ログがどんどん溜まっていかないの?

ペンギン先生 ペンギン先生

定期的に「チェックポイント」という処理で、ログの内容を本体に反映済みにして古いログを削除するよ。PostgreSQLだとwal_sizeで上限を設定できるし、レプリケーションでWALを別サーバーに転送して待機系を作る使い方もあるんだ

ひよこ ひよこ

WALってどのデータベースでも使ってるの?

ペンギン先生 ペンギン先生

PostgreSQLSQLiteMySQL(InnoDBのRedoログ)、SQL Serverなど主要なRDBMSはほぼ全部WALの考え方を採用しているよ。それどころかLSMツリーを使うNoSQLでもWALは必須だし、分散データベースではWALをPaxosやRaftで複製して耐障害性を高める設計が主流だね

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「WAL」って出てきたら「本番に書く前にまずログに記録しておく安全装置」と思えばだいたいOK!
📖 おまけ:英語の意味
「Write-Ahead Log」 = 先行書き込みログ
💬 Write-Ahead(先に書く)Log(ログ)で、本体より先にログに書くという意味だよ
← 用語集にもどる