在备库上监控 WAL 接收和回放延迟(pg_stat_wal_receiver)
PostgreSQL复制命令
-- Run on the standby:
SELECT pg_is_in_recovery() AS in_recovery,
pg_last_wal_receive_lsn() AS receive_lsn,
pg_last_wal_replay_lsn() AS replay_lsn,
pg_size_pretty(pg_wal_lsn_diff(pg_last_wal_receive_lsn(), pg_last_wal_replay_lsn())) AS replay_backlog,
now() - pg_last_xact_replay_timestamp() AS last_replay_age,
pg_get_wal_replay_pause_state() AS pause_state;
SELECT pid, status, sender_host, sender_port, slot_name, received_tli, flushed_lsn, latest_end_lsn, now() - last_msg_receipt_time AS since_last_msg FROM pg_stat_wal_receiver;作用
显示备库已接收多少 WAL、已应用多少(回放积压)、最后回放事务的时长、回放是否暂停,以及 walreceiver 连接状态(哪个主库、复制槽、timeline、最后消息时间)。
适用场景
用于在主库不可达或级联备库上诊断延迟;出现 'standby behind' 告警时,区分网络(接收)问题和回放(I/O、冲突)问题。
注意
如果 pg_stat_wal_receiver 不返回任何行,说明备库没有进行流复制(从归档获取或已断开)。即使主库没有写入,last_replay_age 也会增长;请结合 receive_lsn/replay_lsn 的差值来解读。如果接收在推进而回放积压在增长,说明备库上有长查询(max_standby_streaming_delay)或存在 I/O 瓶颈。