如下對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;





