ログ先行書き込み(WAL)
PostgreSQL のログ先行書き込み(WAL)とは?
ログ先行書き込みは、すべての変更をデータファイルに反映する前に記録するため、PostgreSQL はクラッシュ後に復旧できます。WAL はレプリケーションやポイントインタイムリカバリにも使われます。
ログ先行書き込みの中心となる考え方は、データファイルへの変更は、その変更がログに記録され、ログが永続ストレージにフラッシュされた後にのみ書き込める、というものです。クラッシュ後、PostgreSQL は最後のチェックポイントからログを再生し、データファイルを一貫した状態に戻します。
トランザクションのコミット時にフラッシュが必要なのは、変更したすべてのデータページではなくシーケンシャルなログだけなので、WAL はディスクへの書き込みも削減します。同じ WAL レコードのストリームが、ストリーミングレプリケーションでスタンバイサーバーに送られ、継続的アーカイブでポイントインタイムリカバリ用に保存されます。ログ内の位置はログシーケンス番号(LSN)と呼ばれます。
例
この例では、設定されている wal_level と、10,000 行のテーブルを作成する前後の現在の WAL 位置を表示します。新しいテーブルがログに書き込まれたため、2 回目の位置のほうが先に進んでいます。
SHOW wal_level;
SELECT pg_current_wal_lsn();
CREATE TABLE wal_demo AS SELECT g FROM generate_series(1, 10000) AS g;
SELECT pg_current_wal_lsn();拡張機能なしの標準の PostgreSQL 16 または 17 で動くプレーンな SQL です。破棄してかまわない空のデータベースで実行してください。
出典
PostgreSQL 公式ドキュメント(英語)。