Postgresql通过pg_waldump来分析pg_wal日志

一、简介

读取MySQL的binlog 并将其解析为可读的日志是一件简单的事情,mysqlbinlog 命令就可以将bin日志解析, 那postgresql是否可以将pg_wal 中的日志进行解析,并且提供一些特殊的功能,例如想查询某个时间短插入的数据量。pg_waldump 可以解决这个问题,通过pg_waldump来解析pg_wal 日志来分析和解决一些问题。

二、wal内部

WAL是自动被启用的。除了确保满足WAL日志存放所需要的磁盘空间以及一些必要的调优外,管理员无需执行任何操作。当每个新记录被写入时,WAL记录被追加到WAL日志中。 插入位置由日志序列号(LSN)描述,该日志序列号是日志中的字节偏移量, 随每个新记录单调递增。WAL日志被存放在数据目录的pg_wal目录里,它是作为一个文件段的集合存储的,通常每个段16MB大小(不过这个大小可以通过initdb配置选项--with-wal-segsize来修改)。每个段分割成多个页,通常每个页为8K。段文件的名字是不断增长的数字,从000000010000000000000001开始。目前这些数字不能回卷。

wal日志被放置在和主数据库文件不同的另外一个磁盘上会比较好。你可以通过把pg_wal目录移动到另外一个位置(当然在此期间服务器应当被关闭),然后在原来的位置上创建一个指向新位置的符号链接来实现重定位日志。

在完成一个检查点并且刷写了日志文件之后,检查点的位置被保存在文件pg_control里。因此在恢复的开始, 服务器首先读取pg_control,然后读取检查点记录; 接着它通过从检查点记录里标识的日志位置开始向前扫描执行 REDO操作。 因为数据页的所有内容都保存在检查点之后的第一个页面修改的日志里(假设full_page_writes没有被禁用), 所以自检查点以来的所有变化的页都将被恢复到一个一致的状态。

pg_control很小(比一个磁盘页小),因此它不会出现页断裂问题, 并且到目前为止还没有发现仅仅由于无法读取pg_control本身导致数据库失败的报告。 因此,尽管这在理论上是一个薄弱环节,但是pg_control看起来似乎并不是实际会发生的问题。

三、分析示例

1、展示 STARTSEG 到 ENDSEG 的事务日志

 

 2、日志参数介绍

rmgr : 资源名称

lsn: 0/0162D3F0 日志编号
prev 0/0162D3B8
desc 对日志详细信息的描述
xid 事务id
3、连接数据库,表中插入数据

 查看此时 wal 日志,如果没有日志则通过手动切换select pg_switch_wal()

 发现插入数据后,wal 日志会先进入资源等待 rmgr: Standby ,分配一个事务id  15718 ,进入rmgr: Heap,把插入事务写入到指定日志偏移位置 desc: INSERT off 5  ,进入索引资源 rmgr: Btree ,插入索引 desc: INSERT_LEAF off 3,分配下一事务id RUNNING_XACTS nextXid 15720 latestCompletedXid 15719 oldestRunningXid 15720
4、执行 update 语句

查看日志

 发现此时 desc:  UPDATE off 1 xmax 15725 ; 事务日志已经写入,desc: COMMIT 2022-02-14 00:37:59.569893 PST 完成提交

5、执行delete语句

查看日志

发现此时descDELETE off 15  KEYS_UPDATED 写入日志,desc:COMMIT 2022-02-14 00:42:00.195505 PST事务提交

 6、显示事务回滚

 查看日志

 

 发现此时 desc: ABORT 2022-02-14 00:46:03.515257 PST 事务已经取消

7、创建数据库

 查看日志

 

 四、pg_waldump参数

 pg_waldump --help pg_waldump decodes and display

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

 

posted @ 2022-02-14 16:00  数据库集中营  阅读(1712)  评论(0编辑  收藏  举报