用語集のすべての用語

ログ先行書き込み(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 公式ドキュメント(英語)。

関連用語