PG wal日志LSN相关函数

来源:这里教程网 时间:2026-03-14 20:25:12 作者:

如下对PG一些wal以及LSN相关函数进行介绍

1.wal文件名组成

wal在$PGDATA/pg_wal下。10之前为pg_xlog wal命名格式文件名称为16进制的24个字符组成,每8个字符一组,每组的意义如下:

00000001 00000000 00000001
-------- -------- -------- 
时间线     逻辑id    物理id

2.查看wal时间

postgres=# select * from pg_ls_waldir() order by modification asc;

image.png

pg_ls_waldir返回预写式日志(WAL)目录中每个文件的名称、尺寸以及最后的修改时间(mtime)。 默认情况下,只有超级用户以及pg_monitor角色的成员能够使用这个函数。可以使用GRANT把访问授予给其他人。

3.确认当前的日志的以及LSN号

select pg_current_wal_lsn(),pg_walfile_name(pg_current_wal_lsn()),pg_walfile_name_offset(pg_current_wal_lsn());

image.png

预写式日志写入位置、转换预写式日志文件名、转换预写式日志位置为文件名以及文件内的十进制字节偏移量

4.查看当前的预写式日志刷写位置、当前预写式日志插入位置、当前预写式日志写入位置

select pg_current_wal_flush_lsn(),pg_current_wal_insert_lsn(),pg_current_wal_lsn();

image.png

5.计算两个预写式日志位置间的差别

select pg_wal_lsn_diff('0/8BF6C80','0/8BF6C68');

image.png

pg_wal_lsn_diff以字节数计算两个预写日志位置之间的差别。它可以和pg_stat_replication一起使用来获得复制延迟。

6.恢复相关位置及时间戳

获得最后一个收到并由流复制同步到磁盘的预写日志位置。当流复制在进行中时,这将单调增加。如果恢复已经完成,这将保持静止在恢复过程中收到并同步到磁盘的最后一个 WAL 记录。如果流复制被禁用,或者还没有被启动,该函数返回 NULL

select pg_last_wal_receive_lsn();

image.png

获得恢复过程中被重放的最后一个预写日志位置。当流复制在进行中时,这将单调增加。如果恢复已经完成,这将保持静止在恢复过程中被应用的最后一个 WAL 记录。如果服务器被正常启动而没有恢复,该函数返回 NULL。

select pg_last_wal_replay_lsn();

image.png

获得恢复过程中被重放的最后一个事务的时间戳。这是在主机上产生的事务的提交或中止 WAL 记录·的时间。如果在恢复过程中没有事务被重放,这个函数返回 NULL。否则,如果恢复仍在进行这将单调增加。如果恢复已经完成,则这个值会保持静止在恢复过程中最后一个被应用的事务。如果服务器被正常启动而没有恢复,该函数返回 NULL。

select pg_last_xact_replay_timestamp();

image.png

监控主库延迟

方式一、通过WAL延迟时间衡量 select pid,usename,client_addr,state,write_lag,flush_lag,replay_lag from pg_stat_replication; image.png pg10前使用: select extract(second from now() - pg_last_xact_replay_timestamp());

方式二、通过WAL日志应用延迟量衡量 通过流复制备库WAL的应用位置和主库本地WAL写入位置之间的WAL日志量能够准确判断主备延时,在流复制主库执行以下SQL: select pid,usename,client_addr,state, pg_wal_lsn_diff(pg_current_wal_lsn(),write_lsn) write_delay, pg_wal_lsn_diff(pg_current_wal_lsn(),flush_lsn) flush_delay, pg_wal_lsn_diff(pg_current_wal_lsn(),replay_lsn) replay_dely from pg_stat_replication; image.png

相关推荐