Skip to content

Instantly share code, notes, and snippets.

@kmikmy
Last active October 23, 2015 08:21
Show Gist options
  • Save kmikmy/999214984d242f95e80f to your computer and use it in GitHub Desktop.
Save kmikmy/999214984d242f95e80f to your computer and use it in GitHub Desktop.
PostgreSQL 9.4のロギングについて

PostgreSQL 9.4のロギングについて

概要

backend/access/transam/README

PostgresのコードではWALのサブシステムのことをXLOGと呼ぶ。

WALの基本的な前提は、そのログが記述しているデータページの変更の前に
そのログエントリを永続ストレージに記録させること。

WALによってログをその終わりまで再実行することで、部分的に実行されている
トランザクションが存在しないような一貫性のある状態にすることを保証する。

これを保証するために各データページ(ヒープや、インデックス)はそのページに
適用した最新のXLOGレコードのLSN(log sequence number --- LSN=WALファイルの
オフセットでもある)と共にマークされる。

ページにマークされているLSNのことをpageLSNと呼ぶ。

バッファマネージャがあるダーティページを書き出す前には、少なくとも
そのページのpageLSNまでxlogがフラッシュされていなければならない。

WALの再実行している間、現在のログエントリに記録された変化が既にページに
適用されているかどうかを検出するために、そのページのpageLSNをチェックする。

公式マニュアル

https://www.sraoss.co.jp/PostgreSQL/Manual/document/9.4/html/runtime-config-wal.html

関連するソースファイル

  • backend/access/transam/

  • xact.c

  • xlog.c

  • xlogfuncs.c

  • xlogreader.c

  • xlogutils.c

  • include/access/

  • xact.h

  • xlog.h

  • xlog_fn.h

  • xlogreader.h

  • xlogutils.h

  • xlogdefs.h

  • xlog_internal.h

主要な関数

backend/access/transam/xlog.c

  • ログレコードをWALバッファへ挿入する関数:XLogInsert
  • WALバッファの中身をWALファイルへ書き込む関数:XLogFlush(XLogWrite)

ロギングの流れ

  1. XLogInsertが何回か呼ばれてログレコードがWALバッファに溜められる
  2. XLogFlush(XLogRecPtr record)で与えられたレコードの位置までWALファイルにフラッシュする
  3. XLogFlush内部から実際にログレコードを書き込むXLogWrite(XLogwrtRqst WriteRqst, bool flexible)が呼ばれる。XLogFlushはリクエストを作成してこの関数に渡している。

WALファイルの管理

トランザクションログはpg_xlog/に保存される。

コミットログはpg_clog/に保存される。

XLOG Segment

一つのWALファイルに相当。 pg_xlog/以下に保存される。

一つのファイルサイズはXLOG_SEG_SZで指定される

XLOG_SEG_SZは ./configureにより作成(デフォルトで16MB)

複数のXLOG Blockの集合でできている。

XLOG Block

トランザクションログ書き出しの最小単位。LOG_BLCKSZで指定される。

LOG_SEG_SZは./configureにより作成(デフォルトで8KB)

先頭にXLogPageHeaderData(xlog_internal.h)構造体を含む。

XLogPageHeaderDataは実際のレコードのサイズのtotal lenなどを含む。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment