PostgreSQL服务器优雅关闭前WAL归档量及关闭耗时预估咨询
查看待归档的WAL文件数量/大小
可通过PostgreSQL内置系统视图与函数获取待归档WAL的相关信息:
- 借助
pg_stat_archiver视图:该视图记录归档进程的运行统计,通过对比当前WAL位置与最后归档的WAL位置,可计算待归档数量:- 获取最后归档的WAL文件名:
SELECT last_archived_wal FROM pg_stat_archiver; - 获取当前正在写入的WAL文件名:
SELECT pg_walfile_name(pg_current_wal_lsn()); - WAL文件名按序列递增(如
0000000100000000000000A1与0000000100000000000000A5),两者间的文件数即为待归档数量。
- 获取最后归档的WAL文件名:
- 使用
pg_ls_waldir()函数:列出WAL目录下所有文件,结合pg_stat_archiver筛选待归档文件:
若归档进程从未运行(SELECT count(*) AS pending_archive_count, sum(size) AS pending_archive_size_bytes FROM pg_ls_waldir() WHERE name > (SELECT last_archived_wal FROM pg_stat_archiver) AND name ~ '^[0-9A-F]{24}$'; -- 过滤合法WAL文件,排除临时文件等last_archived_wal为NULL),则所有非当前写入的WAL文件均属于待归档范围。
预估优雅关闭的耗时
优雅关闭的主要耗时来自检查点完成与剩余WAL归档两部分,可通过系统表统计数据粗略预估:
- 检查点耗时预估:查看
pg_stat_bgwriter视图的历史检查点统计:
两个平均值的总和可作为检查点阶段的参考耗时。若当前距离上一次检查点的WAL量较大(通过SELECT avg(checkpoint_write_time) AS avg_checkpoint_write_ms, avg(checkpoint_sync_time) AS avg_checkpoint_sync_ms FROM pg_stat_bgwriter;pg_current_wal_lsn() - pg_last_checkpoint_lsn()计算字节数),实际耗时可能高于平均值。 - 归档耗时预估:结合待归档WAL总大小与历史归档速率:
- 从
pg_stat_archiver获取总归档数据与时间:SELECT total_archived_bytes, EXTRACT(EPOCH FROM now() - stats_reset) AS total_archive_seconds FROM pg_stat_archiver; - 计算历史归档速率:
total_archived_bytes / total_archive_seconds(单位:字节/秒) - 用待归档WAL总大小除以速率,得到归档阶段的预估耗时。
- 从
- 注意:实际耗时还受磁盘IO性能、网络带宽(若归档至远程存储)、系统负载等因素影响,以上仅为基于历史数据的粗略参考。
内容的提问来源于stack exchange,提问作者user1396267
相关产品推荐
相关产品推荐

