Skip to content

Instantly share code, notes, and snippets.

@kmikmy
Last active December 4, 2015 07:41
Show Gist options
  • Save kmikmy/2bc1d92583248201bff1 to your computer and use it in GitHub Desktop.
Save kmikmy/2bc1d92583248201bff1 to your computer and use it in GitHub Desktop.
pg_xlogdump の使い方

pg_xlogdumpツールについて

/usr/local/pgsql/data/pg_xlogに含まれるWALログをhuman-readableな形で表示してくれるツール

インストール方法

postgresのソースコードに含まれるcontrib/pg_xlogdump内にcdして

$ make 
# make install

するだけ。

WALファイルの名前のフォーマットについて

pg_xlogに含まれるのWALファイルの名前は16進数8桁の次の3つのフィールドから成る。

  • Timeline ID
  • High Segment ID(フォーマットされたセグメント番号の上位8桁)
  • Low Segment ID(フォーマットされたセグメント番号の下位8桁)

(High Segment ID や Low Segment IDは私が説明上でつけた名前で、公式にそう呼ばれているわけではありません。)

歴史的な経緯があり、やや奇妙だが、次のやり方でセグメント番号は16桁の16進数にフォーマットされる。

#define XLogFileName(fname, tli, logSegNo)  \
    snprintf(fname, MAXFNAMELEN, "%08X%08X%08X", tli,       \
             (uint32) ((logSegNo) / XLogSegmentsPerXLogId), \
             (uint32) ((logSegNo) % XLogSegmentsPerXLogId))

実際のファイルは次のようになっている。

$ pwd
/usr/local/pgsql/data/pg_xlog
$ ls
000000010000000000000003  000000010000000000000004  000000010000000000000005  archive_status

「000000010000000000000003」は'00000001' '00000000' '00000003'の3つに分かれており、 Timeline ID が 00000001 High Segment ID が 00000000 Low Segment ID が 00000003 となる。

psqlのWALファイル情報取得コマンド

  • pg_current_xlog_insert_location()で、pg_lsn型の現在のWALファイルの挿入位置(LSN)を取得する。
  • pg_current_xlog_location() で、pg_lsn型の現在のWALファイルの書き込み位置(LSN)を取得する。
  • pg_xlogfile_name(location pg_lsn)は、LSNを渡して、そのLSNを含むWALファイルの名前を取得する。
test=> BEGIN transaction;
BEGIN
test=> UPDATE t SET value=12 WHERE key=2;
UPDATE 1
test=> SELECT pg_current_xlog_insert_location();
 pg_current_xlog_insert_location
---------------------------------
 0/30084A8
(1 row)

test=> SELECT pg_current_xlog_location();
 pg_current_xlog_location
--------------------------
 0/3008000
(1 row)

test=> SELECT pg_xlogfile_name('0/3008000');
     pg_xlogfile_name
--------------------------
 000000010000000000000003
(1 row)

pg_xlogdumpの使い方

ファイル名or開始地点のLSNを引数に指定する

$ /usr/local/pgsql/bin/pg_xlogdump 000000010000000000000003
rmgr: Heap        len (rec/tot):     36/  2024, tx:        804, lsn: 0/03007CA8, prev 0/03007C40, bkp: 1000, desc: hot_update: rel 1663/16384/16386; tid 289/23 xmax 804 ; new tid 289/25 xmax 0
rmgr: XLOG        len (rec/tot):     72/   104, tx:          0, lsn: 0/030084A8, prev 0/03007CA8, bkp: 0000, desc: checkpoint: redo 0/30084A8; tli 1; prev tli 1; fpw true; xid 0/805; oid 24576; multi 1; offset 0; oldest xid 760 in DB 1; oldest multi 1 in DB 1; oldest running xid 0; online
rmgr: Transaction len (rec/tot):     12/    44, tx:        804, lsn: 0/03008510, prev 0/030084A8, bkp: 0000, desc: commit: 2015-12-04 15:30:17.228103 JST
...
$ pg_xlogdump --start 0/3008000
pg_xlogdump: FATAL:  error in WAL record at 0/3008540: record with zero length at 0/30085A8

first record is after 0/3008000, at 0/30084A8, skipping over 1192 bytes
rmgr: XLOG        len (rec/tot):     72/   104, tx:          0, lsn: 0/030084A8, prev 0/03007CA8, bkp: 0000, desc: checkpoint: redo 0/30084A8; tli 1; prev tli 1; fpw true; xid 0/805; oid 24576; multi 1; offset 0; oldest xid 760 in DB 1; oldest multi 1 in DB 1; oldest running xid 0; online
rmgr: Transaction len (rec/tot):     12/    44, tx:        804, lsn: 0/03008510, prev 0/030084A8, bkp: 0000, desc: commit: 2015-12-04 15:30:17.228103 JST
rmgr: XLOG        len (rec/tot):     72/   104, tx:          0, lsn: 0/03008540, prev 0/03008510, bkp: 0000, desc: checkpoint: redo 0/3008540; tli 1; prev tli 1; fpw true; xid 0/805; oid 24576; multi 1; offset 0; oldest xid 760 in DB 1; oldest multi 1 in DB 1; oldest running xid 0; online

resource managerの指定もできる

$ /usr/local/pgsql/bin/pg_xlogdump 000000010000000000000003 --rmgr=Transaction
rmgr: Transaction len (rec/tot):     12/    44, tx:        780, lsn: 0/03000028, prev 0/021E8BC0, bkp: 0000, desc: commit: 2015-11-13 14:31:46.324899 JST
rmgr: Transaction len (rec/tot):     12/    44, tx:        781, lsn: 0/03000698, prev 0/03000190, bkp: 0000, desc: commit: 2015-11-13 14:44:09.363498 JST
rmgr: Transaction len (rec/tot):     12/    44, tx:        782, lsn: 0/03000C58, prev 0/03000730, bkp: 0000, desc: commit: 2015-11-13 14:50:11.798629 JST
/usr/local/pgsql/bin/pg_xlogdump 000000010000000000000003 --rmgr=Heap
rmgr: Heap        len (rec/tot):     36/  1288, tx:        781, lsn: 0/03000190, prev 0/03000128, bkp: 1000, desc: hot_update: rel 1663/16384/16386; tid 289/1 xmax 781 ; new tid 289/2 xmax 0
rmgr: Heap        len (rec/tot):     36/  1320, tx:        782, lsn: 0/03000730, prev 0/030006C8, bkp: 1000, desc: hot_update: rel 1663/16384/16386; tid 289/2 xmax 782 ; new tid 289/3 xmax 0
rmgr: Heap        len (rec/tot):     36/  1352, tx:        783, lsn: 0/03000CF0, prev 0/03000C88, bkp: 1000, desc: hot_update: rel 1663/16384/16386; tid 289/226 xmax 783 ; new tid 289/4 xmax 0

トランザクションIDの指定もできる

$ /usr/local/pgsql/bin/pg_xlogdump 000000010000000000000003 -x 800
rmgr: Heap        len (rec/tot):     46/    78, tx:        800, lsn: 0/03006A20, prev 0/030069F0, bkp: 0000, desc: hot_update: rel 1663/16384/16386; tid 289/20 xmax 800 ; new tid 289/21 xmax 0
rmgr: Transaction len (rec/tot):     12/    44, tx:        800, lsn: 0/03006A70, prev 0/03006A20, bkp: 0000, desc: commit: 2015-12-04 14:03:36.093908 JST

(参考)

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