💾

【PostgreSQL】WALの仕組みについてまとめました

2024/10/29に公開

概要

PostgreSQLにおけるWALについて調べたので備忘録として残します。

WAL

https://www.postgresql.jp/document/8.0/html/wal.html
ログ先行書き込み(Write Ahead Log)の略でトランザクション処理を行う前にログとして記録する仕組みをとなります。

目的

WALを利用する目的としては大きく2点あります。

  • 障害などによりトランザクションが中断されてしまった場合に、中断されたトランザクションを再実行することができる(ロールフォワード)
  • DBのデータが破損したときに、データを復旧することができる

保存方法

WALはファイルとして保存されており、設定がデフォルトの場合は/PostgreSQLの作業フォルダ/pg_xlog/に保存されます。
また、WALはラウンドロビン方式で保存されるため、日付の古いファイルを順番に上書きされていきます。

メリット

WALの仕組みのメリットとしてはトランザクション処理による共有メモリからディスクへの書き込み回数を少なくすることが可能になります。
ここで、PostgreSQLのメモリについて詳しく見ていきます。

PostgreSQLのメモリ

PostgreSQLには大きく共有メモリプロセスメモリの2つに分けられます。
共有メモリは PostgreSQL の全体で使用できるメモリであり、プロセスメモリはバックグラウンドワーカ(バックグラウンプロセス)を実行するときに利用するメモリです。
共有メモリには大きく4件のメモリがあります。

  • 共有バッファ
    SQLを実行したときに一時的に作成されるバッファ(キャッシュ)を保存する領域
  • WALバッファ
    ディスクに書き込んでいないWALを一時的に保存する領域
  • 可視性マップ
  • 空き領域マップ

共有バッファに保存されているキャッシュやデータファイルは消えてしまうためにディスク領域に書き込み処理が実行されます。
そのため、障害が発生した場合は共有バッファにあるデータファイルが消えてしまうため、更新したはずのテーブルの情報が消えてしまうことがあります。
そこで、WALファイルからリストアすることで、テーブル情報をいつでも復旧させることができます。

参考

https://gihyo.jp/dev/feature/01/dex_postgresql/0002?page=2
https://www.nminoru.jp/~nminoru/postgresql/pg-table-and-block-structure.html#block-and-page
https://www.nminoru.jp/~nminoru/postgresql/pg-memory-management.html
https://www.fujitsu.com/jp/products/software/resources/feature-stories/postgres/article-index/architecture-overview/#:~:text=共有バッファー(shared_buffers),キャッシュを経由します)。

Discussion