pg_waldump是Halo数据库用来对wal日志进行查看的命令,需要pg_waldump执行命令对于要读取的日志有只读的权限即可。
在 pg_wal 中日志是有管理类型的,也就是日志记录的东西是什么的标签。

下面我们测试操作创建一个数据库,创建一个表,插入5条记录。
1.记录当前的current_wal_lsn值
halo0root=# select pg_current_wal_lsn();
pg_current_wal_lsn
--------------------
0/1E71B78
(1 行记录)
halo0root=#
halo0root=# create database test1;
CREATE DATABASE
halo0root=# select pg_current_wal_lsn();
pg_current_wal_lsn
--------------------
0/1E72D80
(1 行记录)2.创建一个测试表t1,并记录current_wal_lsn
halo0root=# create table t1(id int);
CREATE TABLE
halo0root=#
halo0root=# select pg_current_wal_lsn();
pg_current_wal_lsn
--------------------
0/1E88C20
(1 行记录)
3.插入5条测试数据,并记录current_wal_lsn
halo0root=# insert into t1 values(1);
INSERT 0 1
halo0root=# select pg_current_wal_lsn();
pg_current_wal_lsn
--------------------
0/1E88CC0
(1 行记录)
halo0root=# insert into t1 values(2);
INSERT 0 1
halo0root=# select pg_current_wal_lsn();
pg_current_wal_lsn
--------------------
0/1E88D28
(1 行记录)
halo0root=# insert into t1 values(3),(4),(5);
INSERT 0 3
halo0root=# select pg_current_wal_lsn();
pg_current_wal_lsn
--------------------
0/1E88E48
(1 行记录)
4.查询当前操作结束的lsn 号,以及pg_wal 的文件名。
halo0root=# select pg_current_wal_lsn(),pg_walfile_name(pg_current_wal_lsn()),pg_walfile_name_offset(pg_current_wal_lsn());
pg_current_wal_lsn | pg_walfile_name | pg_walfile_name_offset
--------------------+--------------------------+-------------------------------------
0/1E88E80 | 000000010000000000000001 | (000000010000000000000001,15240832)
5.查看pg_wal 日志中记录的建库,建表和插入的操作
pg_waldump /data/halo/pg_wal/000000010000000000000001 -s 0/1E71B78
可以在日志中,查到此创建database的sql语句
rmgr: Database len (rec/tot): 42/ 42, tx: 3109, lsn: 0/01E724F8, prev 0/01E72480, desc: CREATE copy dir 1663/1 to 1663/17652
6.使用oid2name查看新建的数据库test1 的oid为17652 ,与日志里记录的oid相对应。
halo@localhost pg_wal]$ oid2name
All databases:
Oid Database Name Tablespace
----------------------------------
14506 halo0root pg_default
14505 template0 pg_default
1 template1 pg_default
17648 test pg_default
17652 test1 pg_default
7.继续查看日志中建表的相关信息
rmgr: Storage len (rec/tot): 42/ 42, tx: 0, lsn: 0/01E72D80, prev 0/01E72D48, desc: CREATE base/14506/17653
8.可以在日志中看到刚刚执行的插入的5条测试数据和提交动作
rmgr: Heap len (rec/tot): 59/ 59, tx: 3111, lsn: 0/01E88C20, prev 0/01E88BE8, desc: INSERT+INIT off 1 flags 0x00, blkref #0: rel 1663/14506/17653 blk 0
rmgr: Transaction len (rec/tot): 34/ 34, tx: 3111, lsn: 0/01E88C60, prev 0/01E88C20, desc: COMMIT 2023-05-29 14:51:47.670482 CST
rmgr: Standby len (rec/tot): 54/ 54, tx: 0, lsn: 0/01E88C88, prev 0/01E88C60, desc: RUNNING_XACTS nextXid 3112 latestCompletedXid 3110 oldestRunningXid 3111; 1 xacts: 3111
rmgr: Heap len (rec/tot): 59/ 59, tx: 3112, lsn: 0/01E88CC0, prev 0/01E88C88, desc: INSERT off 2 flags 0x00, blkref #0: rel 1663/14506/17653 blk 0
rmgr: Transaction len (rec/tot): 34/ 34, tx: 3112, lsn: 0/01E88D00, prev 0/01E88CC0, desc: COMMIT 2023-05-29 14:51:57.229355 CST
rmgr: Standby len (rec/tot): 50/ 50, tx: 0, lsn: 0/01E88D28, prev 0/01E88D00, desc: RUNNING_XACTS nextXid 3113 latestCompletedXid 3112 oldestRunningXid 3113
rmgr: Heap len (rec/tot): 59/ 59, tx: 3113, lsn: 0/01E88D60, prev 0/01E88D28, desc: INSERT off 3 flags 0x00, blkref #0: rel 1663/14506/17653 blk 0
rmgr: Heap len (rec/tot): 59/ 59, tx: 3113, lsn: 0/01E88DA0, prev 0/01E88D60, desc: INSERT off 4 flags 0x00, blkref #0: rel 1663/14506/17653 blk 0
rmgr: Heap len (rec/tot): 59/ 59, tx: 3113, lsn: 0/01E88DE0, prev 0/01E88DA0, desc: INSERT off 5 flags 0x00, blkref #0: rel 1663/14506/17653 blk 0
以上就是通过pg_waldump来解析Halo数据库的wal日志一般用法,通过观察实际上日志中主要的针对上面的操作有意义的 rmgr 为 database , storage , heap , transaction
1.记录当前的current_wal_lsn值
1) 可以在知道其实的lsn号和日志的名字的基础上进行日志分析的输出,(如上例)
2 ) 可以在不知道lsn号的情况下,进行的日志扫描,如直接将两个日志按照先后,写到命令后,直接进行两个日志及其之间的信息的打印。
pg_waldump /data/halo/pg_wal/000000010000000000000001 000000010000000000000002|more
3) 知道自己的操作主要的目标后,对需要查看的rmgr 类型进行限定
pg_waldump /data/halo/pg_wal/000000010000000000000001 -s 0/1E71B78 -b -f -r transaction
4) pg_waldump 还有一个命令可以对当前的日志进行一个分析和汇总,这里面就包含每种数据类型所占的比例以及统计分析。
pg_waldump /data/halo/pg_wal/000000010000000000000001 000000010000000000000002 -z




