PostgreSQL 恢复信息函数
PostgreSQL 提供了一系列恢复信息函数(Recovery Information Functions),用于监控和获取数据库恢复过程的关键信息,特别是在流复制和PITR(Point-In-Time Recovery)场景中。
一、核心恢复信息函数
1. 恢复状态检测函数
函数 | 描述 | 返回类型 | 示例 |
---|---|---|---|
pg_is_in_recovery() |
检查实例是否处于恢复模式 | boolean | SELECT pg_is_in_recovery(); |
pg_is_wal_replay_paused() |
检查WAL恢复是否暂停 | boolean | SELECT pg_is_wal_replay_paused(); |
2. WAL位置信息函数
函数 | 描述 | 返回类型 |
---|---|---|
pg_last_wal_receive_lsn() |
最后接收的WAL位置 | pg_lsn |
pg_last_wal_replay_lsn() |
最后应用的WAL位置 | pg_lsn |
pg_current_wal_lsn() |
当前WAL写入位置(主库) | pg_lsn |
pg_last_xact_replay_timestamp() |
最后应用的事务时间戳 | timestamptz |
3. 恢复控制点函数
函数 | 描述 | 返回类型 |
---|---|---|
pg_create_restore_point(name) |
创建命名恢复点 | pg_lsn |
pg_switch_wal() |
强制切换WAL文件 | pg_lsn |
二、典型使用场景
1. 监控复制延迟
-- 计算主备延迟(字节)
SELECT
pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn) AS replication_lag_bytes,
pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn)/1024/1024 AS lag_mb,
now() - pg_last_xact_replay_timestamp() AS replication_lag_interval
FROM pg_stat_replication;
2. 检查恢复进度
-- 备库恢复状态全景
SELECT
pg_is_in_recovery() AS is_standby,
pg_last_wal_receive_lsn() AS received_lsn,
pg_last_wal_replay_lsn() AS replayed_lsn,
pg_last_xact_replay_timestamp() AS last_replay_time,
pg_is_wal_replay_paused() AS is_paused,
pg_wal_lsn_diff(pg_last_wal_receive_lsn(), pg_last_wal_replay_lsn()) AS replay_lag_bytes;
3. 创建恢复标记点
-- 重要操作前创建恢复点
SELECT pg_create_restore_point('pre_maintenance_202307');
-- 验证恢复点
SELECT name, lsn, time
FROM pg_restore_points
WHERE name = 'pre_maintenance_202307';
三、高级应用示例
1. 自动化故障转移检测
-- 计算主备延迟(秒级精度)
SELECT
EXTRACT(EPOCH FROM (now() - pg_last_xact_replay_timestamp()))::int AS lag_seconds,
pg_is_in_recovery() AS is_standby
FROM pg_stat_replication;
2. WAL归档监控
-- 结合归档状态监控
SELECT
archived_count,
last_archived_wal,
last_archived_time,
pg_wal_lsn_diff(
pg_current_wal_lsn(),
pg_last_archived_lsn()
) AS bytes_not_archived
FROM pg_stat_archiver;
3. 时间线历史检查
-- 查看时间线历史(PITR重要信息)
SELECT * FROM pg_wal_replay_history();
四、重要注意事项
权限要求:
- 大多数函数需要超级用户权限
- 监控函数通常对监控角色开放
性能影响:
- 频繁调用WAL位置函数可能轻微影响性能
- 生产环境建议适度轮询(如1-5秒间隔)
版本差异:
- PostgreSQL 10+ 使用
pg_wal
前缀(之前版本为pg_xlog
) - 部分函数在早期版本中不可用
- PostgreSQL 10+ 使用
主备差异:
pg_current_wal_lsn()
只在主库有效- 备库上相关函数反映的是恢复进度
五、相关系统视图
-- 复制连接状态
SELECT * FROM pg_stat_replication;
-- WAL归档状态
SELECT * FROM pg_stat_archiver;
-- 可用恢复点
SELECT * FROM pg_restore_points;
-- 复制槽信息
SELECT * FROM pg_replication_slots;
这些恢复信息函数为DBA提供了强大的监控手段,特别是在构建高可用PostgreSQL集群时,是实施健康检查和自动故障转移的基础工具。