PostgreSQL WALの中身を表示する

postgresql
https://pixabay.com/photos/elephant-mamma-animal-nature-2729415/
この記事は約3分で読めます。

PostgreSQLのWAL周りについて調べる機会がありメモ。

pg_waldump

PostgreSQLでは、WALレコードをダンプするpg_waldumpというツールが用意されています。pg_waldumpはコマンドラインツールで、引数にWALセグメントファイルを指定することで、対象のセグメントのレコードを画面にダーっと出力してくれます。WALの内部を知りたい場合、pg_waldumpは大変便利です。

例えば、こんな感じで使えます。

pg_waldumpが出力する内容は以下の通りです。

rmgr リソースマネージャの種別です。PostgreSQLでは、レコード種別ごとにレコードを処理する関数が用意されており、レコード種別で呼び分けられるようになっています。https://doxygen.postgresql.org/rmgrlist_8h_source.html
len (rec/tot) Full-page image (FPI)を除いた長さとレコード全体長さ
tx トランザクションID
lsn 現在読み取ったレコードのLSN
prev 1つ前のレコードのLSN
desc リソースマネージャが出力するWALレコードに関する情報

他にもトランザクションIDを指定したり、WALの開始や終了位置を指定してダンプすることも可能です。

出力はテキスト形式ですので、コマンドラインで加工したりすることもできます。pg_waldumpを触っている中、ふとSQLでも操作できたら良いなと思い、walの読み取り方法や拡張機能の作り方の学習もかねて、walをSQLで出力できるツールwalreaderを作ってみました。この拡張機能は、あくまで学習用です。あまり慣れていないのでバグがあるかもしれません(きっと)。。

walreader

使い方は簡単です。以下で拡張機能をインストールします。

続いて、拡張機能を有効化して、SELECT文を実行します。

pg_waldumpと少し出力が異なります。出力内容は以下です。

timeline タイムラインID
walseg walファイル名
seg_off walファイル内での先頭からのオフセット
page ページNo
page_off ページ内の先頭からのオフセット
rmgr リソースマネージャ種別
rec_len Full-page image (FPI)を除いたレコード長
tot_len トータルレコード長
tot_rlen アライメントされたトータルレコード長
tx トランザクションID
lsn レコードの開始LSN
end_lsn レコードの終了LSN
prev_lsn 1つ前のレコードの開始LSN
identify リソースマネージャでの操作識別子
rmgr_desc リソースマネージャが出力するWALレコードに関する情報
GitHub - moritetu/walreader: a postgresql extension to read wal with sql functions
a postgresql extension to read wal with sql functions - moritetu/walreader

出力したいwalの範囲指定も想定していますが、タイムラインなどの切り替えは考慮されていないです。

WALの構造

walの中身は以下のような感じになっているようです。

wal structure

参考リンク

コメント

タイトルとURLをコピーしました