/usr/local/pgsql/data/pg_xlogに含まれるWALログをhuman-readableな形で表示してくれるツール
postgresのソースコードに含まれるcontrib/pg_xlogdump内にcdして
$ make
# make install
するだけ。
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 となる。
- 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)
ファイル名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
(参考)