本文主要是介绍【PG wal日志LSN相关函数】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
如下对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一起使用来获得复制延迟。
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;
这篇关于【PG wal日志LSN相关函数】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!