PG中通过pg_waldump来分析pg_wal日志
Tags: PGpg_waldumpwal日志
简介
读取MySQL的binlog 并将其解析为可读的日志是一件简单的事情,mysqlbinlog 命令就可以将bin日志解析, 那postgresql是否可以将pg_wal 中的日志进行解析,并且提供一些特殊的功能,例如想查询某个时间短插入的数据量。pg_waldump 可以解决这个问题,通过pg_waldump来解析pg_wal 日志来分析和解决一些问题。
pg_waldump 是PG 内部用来对 wal日志进行查看的命令,值需要pg_waldump执行命令对于要读取的日志有只读的权限即可。
在 pg_wal 中日志是有管理类型的,也就是日志记录的东西是什么的标签。
- 展示 wal 中所有的资源管理名称
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | [postgres@lhrpg ~]$ pg_waldump --rmgr=list XLOG Transaction Storage CLOG Database Tablespace MultiXact RelMap Standby Heap2 Heap Btree Hash Gin Gist Sequence SPGist BRIN CommitTs ReplicationOrigin Generic LogicalMessage |
WAL内部
WAL是自动被启用的。除了确保满足WAL日志存放所需要的磁盘空间以及一些必要的调优外(参阅第 29.4 节),管理员无需执行任何操作。
当每个新记录被写入时,WAL记录被追加到WAL日志中。 插入位置由日志序列号(LSN)描述,该日志序列号是日志中的字节偏移量, 随每个新记录单调递增。LSN值作为数据类型 pg_lsn
返回。 值可以进行比较以计算分离它们的WAL数据量,因此它们用于衡量复制和恢复的进度。
WAL日志被存放在数据目录的pg_wal
目录里,它是作为一个文件段的集合存储的,通常每个段16MB大小(不过这个大小可以通过initdb配置选项--with-wal-segsize
来修改)。每个段分割成多个页,通常每个页为8K(该尺寸可以通过--with-wal-blocksize
配置选项来修改)。日志记录头部在access/xlogrecord.h
里描述;日志内容取决于它记录的事件类型。段文件的名字是不断增长的数字,从000000010000000000000001
开始。目前这些数字不能回卷,不过要把所有可用的数字都用光也需要非常非常长的时间。
日志被放置在和主数据库文件不同的另外一个磁盘上会比较好。你可以通过把pg_wal
目录移动到另外一个位置(当然在此期间服务器应当被关闭),然后在原来的位置上创建一个指向新位置的符号链接来实现重定位日志。
WAL的目的是确保在数据库记录被修改之前先写了日志,但是这可能会被那些谎称向内核写成功的破坏, 这时候它们实际上只是缓冲了数据而并未把数据存储到磁盘上。 这种情况下的电源失效仍然可能导致不可恢复的数据崩溃。 管理员应该确保保存PostgreSQL的WAL日志文件的磁盘不会做这种谎报(参见第 29.1 节)。
在完成一个检查点并且刷写了日志文件之后,检查点的位置被保存在文件pg_control
里。因此在恢复的开始, 服务器首先读取pg_control
,然后读取检查点记录; 接着它通过从检查点记录里标识的日志位置开始向前扫描执行 REDO操作。 因为数据页的所有内容都保存在检查点之后的第一个页面修改的日志里(假设full_page_writes没有被禁用), 所以自检查点以来的所有变化的页都将被恢复到一个一致的状态。
为了处理pg_control
被损坏的情况, 我们应该支持对于现有日志段反向扫描的功能 — 从最新到最老 — 这样才能找到最后的检查点。但这些目前还没有被实现。pg_control
很小(比一个磁盘页小),因此它不会出现页断裂问题, 并且到目前为止还没有发现仅仅由于无法读取pg_control
本身导致数据库失败的报告。 因此,尽管这在理论上是一个薄弱环节,但是pg_control
看起来似乎并不是实际会发生的问题。
示例
- 展示
STARTSEG
到ENDSEG
的事务日志
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | [postgres@pg4 pg_wal]$ pg_waldump 000000010000000000000001 000000010000000000000002 ... rmgr: XLOG len (rec/tot): 106/ 106, tx: 553, lsn: 0/0162C8A8, prev 0/0162C870, desc: CHECKPOINT_ONLINE redo 0/162C870; tli 1; prev tli 1; fpw true; xid 0:554; oid 19719; multi 1; offset 0; oldest xid 548 in DB 1; oldest multi 1 in DB 1; oldest/newest commit timestamp xid: 0/0; oldest running xid 553; online rmgr: Transaction len (rec/tot): 66/ 66, tx: 553, lsn: 0/0162C918, prev 0/0162C8A8, desc: COMMIT 2021-09-26 09:23:05.669905 CST; inval msgs: catcache 21; sync rmgr: Heap len (rec/tot): 54/ 306, tx: 554, lsn: 0/0162C960, prev 0/0162C918, desc: INSERT off 3, blkref #0: rel 1664/0/2396 blk 0 FPW rmgr: Btree len (rec/tot): 53/ 153, tx: 554, lsn: 0/0162CA98, prev 0/0162C960, desc: INSERT_LEAF off 3, blkref #0: rel 1664/0/2397 blk 1 FPW rmgr: Transaction len (rec/tot): 66/ 66, tx: 554, lsn: 0/0162CB38, prev 0/0162CA98, desc: COMMIT 2021-09-26 09:23:05.670051 CST; inval msgs: snapshot 2396 ................. rmgr: XLOG len (rec/tot): 24/ 24, tx: 0, lsn: 0/0164AD70, prev 0/0164AD38, desc: SWITCH rmgr: Standby len (rec/tot): 50/ 50, tx: 0, lsn: 0/02000028, prev 0/0164AD70, desc: RUNNING_XACTS nextXid 567 latestCompletedXid 566 oldestRunningXid 567 rmgr: Standby len (rec/tot): 50/ 50, tx: 0, lsn: 0/02000060, prev 0/02000028, desc: RUNNING_XACTS nextXid 567 latestCompletedXid 566 oldestRunningXid 567 rmgr: XLOG len (rec/tot): 106/ 106, tx: 0, lsn: 0/02000098, prev 0/02000060, desc: CHECKPOINT_ONLINE redo 0/2000060; tli 1; prev tli 1; fpw true; xid 0:567; oid 24576; multi 1; offset 0; oldest xid 548 in DB 1; oldest multi 1 in DB 1; oldest/newest commit timestamp xid: 0/0; oldest running xid 567; online rmgr: Standby len (rec/tot): 50/ 50, tx: 0, lsn: 0/02000108, prev 0/02000098, desc: RUNNING_XACTS nextXid 567 latestCompletedXid 566 oldestRunningXid 567 pg_waldump: FATAL: error in WAL record at 0/2000108: invalid record length at 0/2000140: wanted 24, got 0 |
- 日志参数介绍
1 2 3 4 5 | rmgr : 资源名称 lsn: 0/0162D3F0 日志编号 prev 0/0162D3B8 desc : 对日志详细信息的描述 xid 事务id |
连接数据库,表中插入数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | test=# insert into tt(id ,age) values (11,31); INSERT 0 1 test=# select * from tt; id | age | insert_time ----+-----+---------------------------- 1 | 11 | 2021-09-26 09:41:42.961409 2 | 22 | 2021-09-26 09:44:25.648493 3 | 23 | 2021-09-26 09:44:25.652257 5 | 25 | 2021-09-26 09:44:25.653644 7 | 27 | 2021-09-26 09:44:25.654806 8 | 28 | 2021-09-26 09:44:25.655683 9 | 29 | 2021-09-26 09:44:25.656561 10 | 30 | 2021-09-26 15:18:04.788798 11 | 31 | 2021-09-26 15:47:47.339161 (9 rows) |
查看此时 wal 日志,如果没有日志则通过手动切换select pg_switch_wal()
1 2 3 4 5 6 7 8 9 | [postgres@pg4 pg_wal]$ pg_waldump 000000010000000000000002 rmgr: Standby len (rec/tot): 50/ 50, tx: 0, lsn: 0/02000028, prev 0/0164AD70, desc: RUNNING_XACTS nextXid 567 latestCompletedXid 566 oldestRunningXid 567 rmgr: Standby len (rec/tot): 50/ 50, tx: 0, lsn: 0/02000060, prev 0/02000028, desc: RUNNING_XACTS nextXid 567 latestCompletedXid 566 oldestRunningXid 567 rmgr: XLOG len (rec/tot): 106/ 106, tx: 0, lsn: 0/02000098, prev 0/02000060, desc: CHECKPOINT_ONLINE redo 0/2000060; tli 1; prev tli 1; fpw true; xid 0:567; oid 24576; multi 1; offset 0; oldest xid 548 in DB 1; oldest multi 1 in DB 1; oldest/newest commit timestamp xid: 0/0; oldest running xid 567; online rmgr: Standby len (rec/tot): 50/ 50, tx: 0, lsn: 0/02000108, prev 0/02000098, desc: RUNNING_XACTS nextXid 567 latestCompletedXid 566 oldestRunningXid 567 rmgr: Heap len (rec/tot): 54/ 546, tx: 567, lsn: 0/02000140, prev 0/02000108, desc: INSERT off 9, blkref #0: rel 1663/16385/16386 blk 0 FPW rmgr: Btree len (rec/tot): 53/ 273, tx: 567, lsn: 0/02000368, prev 0/02000140, desc: INSERT_LEAF off 9, blkref #0: rel 1663/16385/16390 blk 1 FPW rmgr: Transaction len (rec/tot): 34/ 34, tx: 567, lsn: 0/02000480, prev 0/02000368, desc: COMMIT 2021-09-26 15:47:47.340016 CST rmgr: Standby len (rec/tot): 50/ 50, tx: 0, lsn: 0/020004A8, prev 0/02000480, desc: RUNNING_XACTS nextXid 568 latestCompletedXid 567 oldestRunningXid 568 |
INSERT off 9 可以看到我们刚刚执行的sql 有日志记录,并且事务的提交,COMMIT 2021-09-26 15:47:47.340016 CST 提交事务
执行 update 语句
1 2 3 | test=# update tt set age = 66 where id = 11; UPDATE 1 test=# |
查看此时的日志
1 2 3 4 5 6 7 8 9 | rmgr: XLOG len (rec/tot): 106/ 106, tx: 0, lsn: 0/020009D8, prev 0/020009A0, desc: CHECKPOINT_ONLINE redo 0/20009A0; tli 1; prev tli 1; fpw true; xid 0:569; oid 24576; multi 1; offset 0; oldest xid 548 in DB 1; oldest multi 1 in DB 1; oldest/newest commit timestamp xid: 0/0; oldest running xid 569; online rmgr: Standby len (rec/tot): 50/ 50, tx: 0, lsn: 0/02000A48, prev 0/020009D8, desc: RUNNING_XACTS nextXid 569 latestCompletedXid 568 oldestR unningXid 569 rmgr: Heap len (rec/tot): 65/ 661, tx: 569, lsn: 0/02000A80, prev 0/02000A48, desc: HOT_UPDATE off 9 xmax 569 ; new off 11 xmax 0, blkref #0 : rel 1663/16385/16386 blk 0 FPW rmgr: Transaction len (rec/tot): 34/ 34, tx: 569, lsn: 0/02000D18, prev 0/02000A80, desc: COMMIT 2021-09-26 16:22:19.062823 CST rmgr: Standby len (rec/tot): 50/ 50, tx: 0, lsn: 0/02000D40, prev 0/02000D18, desc: RUNNING_XACTS nextXid 570 latestCompletedXid 569 oldestR unningXid 570 rmgr: Standby len (rec/tot): 50/ 50, tx: 0, lsn: 0/02000D78, prev 0/02000D40, desc: RUNNING_XACTS nextXid 570 latestCompletedXid 569 oldestR unningXid 570 rmgr: XLOG len (rec/tot): 106/ 106, tx: 0, lsn: 0/02000DB0, prev 0/02000D78, desc: CHECKPOINT_ONLINE redo 0/2000D78; tli 1; prev tli 1; fpw true; xid 0:570; oid 24576; multi 1; offset 0; oldest xid 548 in DB 1; oldest multi 1 in DB 1; oldest/newest commit timestamp xid: 0/0; oldest running xid 570; online rmgr: Standby len (rec/tot): 50/ 50, tx: 0, lsn: 0/02000E20, prev 0/02000DB0, desc: RUNNING_XACTS nextXid 570 latestCompletedXid 569 oldestR unningXid 570 pg_waldump: FATAL: error in WAL record at 0/2000E20: invalid record length at 0/2000E58: wanted 24, got 0 |
发现此时 desc: HOT_UPDATE off 9 xmax 569 ; 事务日志已经写入,desc: COMMIT 2021-09-26 16:22:19.062823 CST 完成提交
执行删除sql
1 2 3 | test=# delete from tt where id = 12; DELETE 1 test=# |
查看此时日志
1 2 3 4 5 6 7 8 9 10 | ... rmgr: Heap len (rec/tot): 65/ 661, tx: 569, lsn: 0/02000A80, prev 0/02000A48, desc: HOT_UPDATE off 9 xmax 569 ; new off 11 xmax 0, blkref #0 : rel 1663/16385/16386 blk 0 FPW rmgr: Transaction len (rec/tot): 34/ 34, tx: 569, lsn: 0/02000D18, prev 0/02000A80, desc: COMMIT 2021-09-26 16:22:19.062823 CST rmgr: Standby len (rec/tot): 50/ 50, tx: 0, lsn: 0/02000D40, prev 0/02000D18, desc: RUNNING_XACTS nextXid 570 latestCompletedXid 569 oldestR unningXid 570 rmgr: Standby len (rec/tot): 50/ 50, tx: 0, lsn: 0/02000D78, prev 0/02000D40, desc: RUNNING_XACTS nextXid 570 latestCompletedXid 569 oldestR unningXid 570 rmgr: XLOG len (rec/tot): 106/ 106, tx: 0, lsn: 0/02000DB0, prev 0/02000D78, desc: CHECKPOINT_ONLINE redo 0/2000D78; tli 1; prev tli 1; fpw true; xid 0:570; oid 24576; multi 1; offset 0; oldest xid 548 in DB 1; oldest multi 1 in DB 1; oldest/newest commit timestamp xid: 0/0; oldest running xid 570; online rmgr: Standby len (rec/tot): 50/ 50, tx: 0, lsn: 0/02000E20, prev 0/02000DB0, desc: RUNNING_XACTS nextXid 570 latestCompletedXid 569 oldestR unningXid 570 rmgr: Heap len (rec/tot): 59/ 655, tx: 570, lsn: 0/02000E58, prev 0/02000E20, desc: DELETE off 10 KEYS_UPDATED , blkref #0: rel 1663/16385/1 6386 blk 0 FPW rmgr: Transaction len (rec/tot): 34/ 34, tx: 570, lsn: 0/020010E8, prev 0/02000E58, desc: COMMIT 2021-09-26 16:26:42.487533 CST pg_waldump: FATAL: error in WAL record at 0/20010E8: invalid record length at 0/2001110: wanted 24, got 0 |
发现此时desc: DELETE off 10 KEYS_UPDATED 写入日志,desc: COMMIT 2021-09-26 16:26:42.487533 CST事务提交
执行查询sql
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | test=# select * from tt; id | age | insert_time ----+-----+---------------------------- 1 | 11 | 2021-09-26 09:41:42.961409 2 | 22 | 2021-09-26 09:44:25.648493 3 | 23 | 2021-09-26 09:44:25.652257 5 | 25 | 2021-09-26 09:44:25.653644 7 | 27 | 2021-09-26 09:44:25.654806 8 | 28 | 2021-09-26 09:44:25.655683 9 | 29 | 2021-09-26 09:44:25.656561 10 | 30 | 2021-09-26 15:18:04.788798 11 | 66 | 2021-09-26 15:47:47.339161 (9 rows) test=# |
查看此时日志
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | rmgr: Standby len (rec/tot): 50/ 50, tx: 0, lsn: 0/02000A48, prev 0/020009D8, desc: RUNNING_XACTS nextXid 569 latestCompletedXid 568 oldestRunningXid 569 rmgr: Heap len (rec/tot): 65/ 661, tx: 569, lsn: 0/02000A80, prev 0/02000A48, desc: HOT_UPDATE off 9 xmax 569 ; new off 11 xmax 0, blkref #0: rel 1663/16385/16386 blk 0 FPW rmgr: Transaction len (rec/tot): 34/ 34, tx: 569, lsn: 0/02000D18, prev 0/02000A80, desc: COMMIT 2021-09-26 16:22:19.062823 CST rmgr: Standby len (rec/tot): 50/ 50, tx: 0, lsn: 0/02000D40, prev 0/02000D18, desc: RUNNING_XACTS nextXid 570 latestCompletedXid 569 oldestRunningXid 570 rmgr: Standby len (rec/tot): 50/ 50, tx: 0, lsn: 0/02000D78, prev 0/02000D40, desc: RUNNING_XACTS nextXid 570 latestCompletedXid 569 oldestRunningXid 570 rmgr: XLOG len (rec/tot): 106/ 106, tx: 0, lsn: 0/02000DB0, prev 0/02000D78, desc: CHECKPOINT_ONLINE redo 0/2000D78; tli 1; prev tli 1; fpw true; xid 0:570; oid 24576; multi 1; offset 0; oldest xid 548 in DB 1; oldest multi 1 in DB 1; oldest/newest commit timestamp xid: 0/0; oldest running xid 570; online rmgr: Standby len (rec/tot): 50/ 50, tx: 0, lsn: 0/02000E20, prev 0/02000DB0, desc: RUNNING_XACTS nextXid 570 latestCompletedXid 569 oldestRunningXid 570 rmgr: Heap len (rec/tot): 59/ 655, tx: 570, lsn: 0/02000E58, prev 0/02000E20, desc: DELETE off 10 KEYS_UPDATED , blkref #0: rel 1663/16385/16386 blk 0 FPW rmgr: Transaction len (rec/tot): 34/ 34, tx: 570, lsn: 0/020010E8, prev 0/02000E58, desc: COMMIT 2021-09-26 16:26:42.487533 CST rmgr: Standby len (rec/tot): 50/ 50, tx: 0, lsn: 0/02001110, prev 0/020010E8, desc: RUNNING_XACTS nextXid 571 latestCompletedXid 570 oldestRunningXid 571 rmgr: Standby len (rec/tot): 50/ 50, tx: 0, lsn: 0/02001148, prev 0/02001110, desc: RUNNING_XACTS nextXid 571 latestCompletedXid 570 oldestRunningXid 571 rmgr: XLOG len (rec/tot): 106/ 106, tx: 0, lsn: 0/02001180, prev 0/02001148, desc: CHECKPOINT_ONLINE redo 0/2001148; tli 1; prev tli 1; fpw true; xid 0:571; oid 24576; multi 1; offset 0; oldest xid 548 in DB 1; oldest multi 1 in DB 1; oldest/newest commit timestamp xid: 0/0; oldest running xid 571; online rmgr: Standby len (rec/tot): 50/ 50, tx: 0, lsn: 0/020011F0, prev 0/02001180, desc: RUNNING_XACTS nextXid 571 latestCompletedXid 570 oldestRunningXid 571 pg_waldump: FATAL: error in WAL record at 0/20011F0: invalid record length at 0/2001228: wanted 24, got 0 发现并没有新增日志 |
查看事务日志
1 2 3 4 5 6 | [postgres@pg4 pg_wal]$ pg_waldump -b -f -r Transaction 000000010000000000000002 000000010000000000000003 rmgr: Transaction len (rec/tot): 34/ 34, tx: 567, lsn: 0/02000480, prev 0/02000368, desc: COMMIT 2021-09-26 15:47:47.340016 CST rmgr: Transaction len (rec/tot): 34/ 34, tx: 568, lsn: 0/02000940, prev 0/02000818, desc: COMMIT 2021-09-26 16:19:56.200336 CST rmgr: Transaction len (rec/tot): 34/ 34, tx: 569, lsn: 0/02000D18, prev 0/02000A80, desc: COMMIT 2021-09-26 16:22:19.062823 CST rmgr: Transaction len (rec/tot): 34/ 34, tx: 570, lsn: 0/020010E8, prev 0/02000E58, desc: COMMIT 2021-09-26 16:26:42.487533 CST rmgr: Transaction len (rec/tot): 34/ 34, tx: 571, lsn: 0/02001628, prev 0/020014E8, desc: COMMIT 2021-09-26 16:46:16.665520 CST |
创建数据库
1 2 3 | test=# create database pgt; CREATE DATABASE test=# |
查看日志
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | [postgres@pg4 pg_wal]$ pg_waldump -b -f -r Database 000000010000000000000002 000000010000000000000003 rmgr: XLOG len (rec/tot): 106/ 106, tx: 0, lsn: 0/020016C0, prev 0/02001688, desc: CHECKPOINT_ONLINE redo 0/2001688; tli 1; prev tli 1; fpw true; xid 0:572; oid 24576; multi 1; offset 0; oldest xid 548 in DB 1; oldest multi 1 in DB 1; oldest/newest commit timestamp xid: 0/0; oldest running xid 572; online rmgr: Standby len (rec/tot): 50/ 50, tx: 0, lsn: 0/02001730, prev 0/020016C0, desc: RUNNING_XACTS nextXid 572 latestCompletedXid 571 oldestRunningXid 572 rmgr: Heap len (rec/tot): 54/ 1482, tx: 572, lsn: 0/02001768, prev 0/02001730, desc: INSERT off 7 blkref #0: rel 1664/0/1262 fork main blk 0 (FPW); hole: offset: 52, length: 6764 rmgr: Btree len (rec/tot): 53/ 217, tx: 572, lsn: 0/02001D38, prev 0/02001768, desc: INSERT_LEAF off 1 blkref #0: rel 1664/0/2671 fork main blk 1 (FPW); hole: offset: 44, length: 8028 rmgr: Btree len (rec/tot): 53/ 193, tx: 572, lsn: 0/02001E18, prev 0/02001D38, desc: INSERT_LEAF off 5 blkref #0: rel 1664/0/2672 fork main blk 1 (FPW); hole: offset: 44, length: 8052 rmgr: Standby len (rec/tot): 54/ 54, tx: 0, lsn: 0/02001EE0, prev 0/02001E18, desc: RUNNING_XACTS nextXid 573 latestCompletedXid 571 oldestRunningXid 572; 1 xacts: 572 rmgr: XLOG len (rec/tot): 106/ 106, tx: 0, lsn: 0/02001F18, prev 0/02001EE0, desc: CHECKPOINT_ONLINE redo 0/2001EE0; tli 1; prev tli 1; fpw true; xid 0:573; oid 24576; multi 1; offset 0; oldest xid 548 in DB 1; oldest multi 1 in DB 1; oldest/newest commit timestamp xid: 0/0; oldest running xid 572; online rmgr: Database len (rec/tot): 42/ 42, tx: 572, lsn: 0/02001F88, prev 0/02001F18, desc: CREATE copy dir 1/1663 to 16392/1663 rmgr: Standby len (rec/tot): 54/ 54, tx: 0, lsn: 0/02001FB8, prev 0/02001F88, desc: RUNNING_XACTS nextXid 573 latestCompletedXid 571 oldestRunningXid 572; 1 xacts: 572 rmgr: XLOG len (rec/tot): 106/ 106, tx: 0, lsn: 0/02001FF0, prev 0/02001FB8, desc: CHECKPOINT_ONLINE redo 0/2001FB8; tli 1; prev tli 1; fpw true; xid 0:573; oid 24576; multi 1; offset 0; oldest xid 548 in DB 1; oldest multi 1 in DB 1; oldest/newest commit timestamp xid: 0/0; oldest running xid 572; online rmgr: Transaction len (rec/tot): 66/ 66, tx: 572, lsn: 0/02002078, prev 0/02001FF0, desc: COMMIT 2021-09-26 17:18:14.699518 CST; inval msgs: catcache 21; sync rmgr: Standby len (rec/tot): 50/ 50, tx: 0, lsn: 0/020020C0, prev 0/02002078, desc: RUNNING_XACTS nextXid 573 latestCompletedXid 572 oldestRunningXid 573 pg_waldump: FATAL: error in WAL record at 0/20020C0: invalid record length at 0/20020F8: wanted 24, got 0 [postgres@pg4 pg_wal]$ |
desc: COMMIT 2021-09-26 17:18:14.699518 CST; 发现创建数据库日志已经写入wal日志
使用 显示事务 进行插入数据
1 2 3 4 5 6 | test=# begin; BEGIN test=# insert into tt (id ,age) values (14,14); INSERT 0 1 test=# |
查看此时 wal日志
1 2 3 4 5 6 7 8 9 10 11 | [postgres@pg4 pg_wal]$ pg_waldump -bf 000000010000000000000004 000000010000000000000005 ... rmgr: Standby len (rec/tot): 50/ 50, tx: 0, lsn: 0/040007F0, prev 0/04000780, desc: RUNNING_XACTS nextXid 575 latestCompletedXid 574 oldestRunningXid 575 rmgr: Heap len (rec/tot): 54/ 858, tx: 575, lsn: 0/04000828, prev 0/040007F0, desc: INSERT off 15 blkref #0: rel 1663/16385/16386 fork main blk 0 (FPW); hole: offset: 84, length: 7388 rmgr: Btree len (rec/tot): 53/ 373, tx: 575, lsn: 0/04000B88, prev 0/04000828, desc: INSERT_LEAF off 13 blkref #0: rel 1663/16385/16390 fork main blk 1 (FPW); hole: offset: 80, length: 7872 rmgr: Standby len (rec/tot): 54/ 54, tx: 0, lsn: 0/04000D00, prev 0/04000B88, desc: RUNNING_XACTS nextXid 576 latestCompletedXid 574 oldestRunningXid 575; 1 xacts: 575 |
发现插入数据后,wal 日志会先进入资源等待 rmgr: Standby ,分配一个事务id 575 ,进入rmgr: Heap,把插入事务写入到指定日志偏移位置 desc: INSERT off 15 ,进入索引资源 rmgr: Btree ,插入索引 desc: INSERT_LEAF off 13,分配下一事务id
RUNNING_XACTS nextXid 576 latestCompletedXid 574 oldestRunningXid 575; 1 xacts: 575
显示事务回滚
1 2 3 4 5 6 7 8 9 10 | test=# begin; BEGIN test=# insert into tt (id ,age) values (14,14); INSERT 0 1 test=# rollback; ROLLBACK test=# end; WARNING: there is no transaction in progress COMMIT test=# |
查看此时 wal 日志
1 2 3 4 5 | rmgr: Standby len (rec/tot): 54/ 54, tx: 0, lsn: 0/04000D38, prev 0/04000D00, desc: RUNNING_XACTS nextXid 576 latestCompletedXid 574 oldestRunningXid 575; 1 xacts: 575 rmgr: XLOG len (rec/tot): 106/ 106, tx: 0, lsn: 0/04000D70, prev 0/04000D38, desc: CHECKPOINT_ONLINE redo 0/4000D38; tli 1; prev tli 1; fpw true; xid 0:576; oid 16393; multi 1; offset 0; oldest xid 548 in DB 1; oldest multi 1 in DB 1; oldest/newest commit timestamp xid: 0/0; oldest running xid 575; online rmgr: Standby len (rec/tot): 54/ 54, tx: 0, lsn: 0/04000DE0, prev 0/04000D70, desc: RUNNING_XACTS nextXid 576 latestCompletedXid 574 oldestRunningXid 575; 1 xacts: 575 rmgr: Transaction len (rec/tot): 34/ 34, tx: 575, lsn: 0/04000E18, prev 0/04000DE0, desc: ABORT 2018-06-27 10:58:25.616921 CST rmgr: Standby len (rec/tot): 50/ 50, tx: 0, lsn: 0/04000E40, prev 0/04000E18, desc: RUNNING_XACTS nextXid 576 latestCompletedXid 575 oldestRunningXid 576 |
发现此时 desc: ABORT 2018-06-27 10:58:25.616921 CST 事务已经取消
pg_waldump
pg_waldump — 以人类可读的形式显示一个PostgreSQL 数据库集簇的预写式日志
大纲
pg_waldump
[option
...] [startseg
[endseg
]]
简介
pg_waldump
显示预写式日志(WAL),它主要 用于调试或者教育目的。
这个工具只能由安装该服务器的用户运行,因为它要求对数据目录的只读访问。
选项
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | postgres@CLW-DB4:/pgdata/10/data/pg_wal> pg_waldump --help pg_waldump decodes and displays PostgreSQL write-ahead logs for debugging. Usage: pg_waldump [OPTION]... [STARTSEG [ENDSEG]] STARTSEG 从指定的日志段文件开始读取。这也隐含地决定了要搜索文件的路径以及 要使用的时间线。 ENDSEG 在读取指定的日志段文件后停止。 Options: -b, --bkp-details 输出有关备份块的细节。 -e, --end=RECPTR 在指定的日志位置停止读取,而不是一直读取到日志流的末尾。 -f, --follow 在到达可用 WAL 的末尾之后,保持每秒轮询一次是否有新的 WAL 出现。 -n, --limit=N 显示指定数量的记录,然后停止。 -p, --path=PATH 要在哪个目录中寻找日志段文件。默认是在当前目录的pg_xlog 子目录中搜索。 -r, --rmgr=RMGR 只显示由指定资源管理器生成的记录。如果把list作为资源管理器名称 传递给这个选项,则打印出可用资源管理器名称的列表然后退出。 -s, --start=RECPTR 要从哪个日志位置开始读取。默认是从找到的最早的文件的第一个可用日志记录开始。 -t, --timeline=TLI 要从哪个时间线读取日志记录。默认是使用startseg(如果指定) 中的值,否则默认为 1 -V, --version 打印pg_xlogdump版本并且退出。 -x, --xid=XID 只显示用给定事务 ID 标记的记录。 -z, --stats[=record] 显示概括统计信息(记录的数量和尺寸以及全页镜像)而不是显示 每个记录。可以选择针对每个记录生成统计信息,而不是针对每个 资源管理器生成。 -?, --help show this help, then exit |
下列命令行选项控制输出的位置和格式:
startseg
从指定的日志段文件开始读取。这也隐含地决定了要搜索文件的路径以及 要使用的时间线。
endseg
在读取指定的日志段文件后停止。
-b
--bkp-details
输出有关备份块的细节。
-e *
end*
--end=*
end*
在指定的WAL位置停止读取,而不是一直读取到日志流的末尾。
-f
--follow
在到达可用 WAL 的末尾之后,保持每秒轮询一次是否有新的 WAL 出现。
-n *
limit*
--limit=*
limit*
显示指定数量的记录,然后停止。
-p *
path*
--path=*
path*
指定搜索日志段文件的目录或包含这些文件的包含
pg_wal
子目录的目录。 缺省值是在当前目录中搜索,当前目录的pg_wal
子目录和PGDATA
的pg_wal
子目录。-q
--quiet
除错误外,不要打印任何输出。当您想知道一系列WAL记录是否可以成功解析但不关心记录内容时,此选项非常有用。
-r *
rmgr*
--rmgr=*
rmgr*
只显示由指定资源管理器生成的记录。如果把
list
作为资源管理器名称 传递给这个选项,则打印出可用资源管理器名称的列表然后退出。-s *
start*
--start=*
start*
要从哪个WAL位置开始读取。默认是从找到的最早的文件的第一个可用日志记录开始。
-t *
timeline*
--timeline=*
timeline*
本人提供Oracle、MySQL、PG等数据库的培训和考证业务,私聊QQ646634621或微信db_bao,谢谢!要从哪个时间线读取日志记录。默认是使用
startseg
(如果指定) 中的值,否则默认为 1。-V
--version
打印pg_waldump版本并且退出。
-x *
xid*
--xid=*
xid*
只显示用给定事务 ID 标记的记录。
-z
--stats[=record]
显示概括统计信息(记录的数量和尺寸以及全页镜像)而不是显示 每个记录。可以选择针对每个记录生成统计信息,而不是针对每个 资源管理器生成。
-?
--help
显示有关pg_waldump命令行参数的帮助并且退出。
Environment
PGDATA
数据目录;另请参阅
-p
选项。PG_COLOR
规定在诊断消息中是否使用颜色。可能的值为
always
、auto
、never
。
注解
当服务器正在运行时可能会给出错误的结果。
只有指定的时间线 会被显示(如果没有指定,则显示默认时间线)。 其他时间线上的记录会被忽略。
pg_waldump不能读取具有后缀.partial
的 WAL 文件。如果需要读取那些文件,需要从文件名中移除 .partial
后缀。