如下对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;
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());
预写式日志写入位置、转换预写式日志文件名、转换预写式日志位置为文件名以及文件内的十进制字节偏移量
4.查看当前的预写式日志刷写位置、当前预写式日志插入位置、当前预写式日志写入位置
select pg_current_wal_flush_lsn(),pg_current_wal_insert_lsn(),pg_current_wal_lsn();
5.计算两个预写式日志位置间的差别
select pg_wal_lsn_diff('0/8bf6c80','0/8bf6c68');
pg_wal_lsn_diff以字节数计算两个预写日志位置之间的差别。它可以和pg_stat_replication一起使用来获得复制延迟。
计算两个lsn之间生成的wal的量
postgres=# select '76/7e000108'::pg_lsn - '76/7e000060'::pg_lsn size_bytes;
size_bytes
------------
168
(1 row)
6.恢复相关位置及时间戳
获得最后一个收到并由流复制同步到磁盘的预写日志位置。当流复制在进行中时,这将单调增加。如果恢复已经完成,这将保持静止在恢复过程中收到并同步到磁盘的最后一个 wal 记录。如果流复制被禁用,或者还没有被启动,该函数返回 null
select pg_last_wal_receive_lsn();
获得恢复过程中被重放的最后一个预写日志位置。当流复制在进行中时,这将单调增加。如果恢复已经完成,这将保持静止在恢复过程中被应用的最后一个 wal 记录。如果服务器被正常启动而没有恢复,该函数返回 null。
select pg_last_wal_replay_lsn();
获得恢复过程中被重放的最后一个事务的时间戳。这是在主机上产生的事务的提交或中止 wal 记录·的时间。如果在恢复过程中没有事务被重放,这个函数返回 null。否则,如果恢复仍在进行这将单调增加。如果恢复已经完成,则这个值会保持静止在恢复过程中最后一个被应用的事务。如果服务器被正常启动而没有恢复,该函数返回 null。
select pg_last_xact_replay_timestamp();
监控主库延迟
方式一、通过wal延迟时间衡量
select pid,usename,client_addr,state,write_lag,flush_lag,replay_lag from pg_stat_replication;
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;