PostgreSQL 8.4.20:pg_xlogs旧文件清理与文件数量控制咨询
针对你在PostgreSQL 8.4.20里遇到的WAL日志留存问题,我来一步步给你拆解解答:
1. pg_xlog保留约7个文件的控制参数
在PostgreSQL 8.4版本中,pg_xlog目录里留存的WAL文件数量主要由wal_keep_segments参数控制。这个参数定义了即使WAL文件已经完成归档,PostgreSQL也要保留的最小WAL段文件数量。每个WAL段默认是16MB(这个大小是编译时确定的,8.4里没法通过参数修改)。你看到的7个文件,大概率是wal_keep_segments被设置为7了,或者如果没显式配置,可能是因为有短时间的在线备份(比如用pg_start_backup启动的备份)在运行,PostgreSQL会临时保留备份期间生成的WAL文件直到备份结束。
2. 是否存在文件数量大幅增长的风险?
这个得分情况来看:
- 如果你的归档命令运行稳定,没有长时间挂起的在线备份,且
wal_keep_segments设置合理,那一般不会出现WAL文件大幅堆积的情况。 - 但如果归档命令出问题了(比如归档目录磁盘满了、权限不足、脚本执行出错),PostgreSQL会停止删除已完成归档的WAL文件,这时候pg_xlog里的文件会持续增加,直到把磁盘占满。
- 另外如果有长时间未结束的在线备份(比如忘记执行
pg_stop_backup),PostgreSQL会一直保留备份启动后生成的所有WAL文件,也会导致文件数量大幅增长。
3. 如何限制日志量不超过48小时的留存?
要实现这个目标,你可以按以下步骤操作:
- 第一步:计算48小时所需的WAL段数
先统计你的数据库每小时生成的WAL文件数量:比如查看pg_xlog目录下文件的修改时间,统计24小时内生成的文件数,算出每小时的平均量,再乘以48得到总段数(可以多留10%的冗余量)。比如每小时生成3个WAL文件,48小时就是144个,那可以把wal_keep_segments设为150。 - 第二步:配置
wal_keep_segments参数
编辑postgresql.conf文件,添加或修改:
注意:PostgreSQL 8.4中这个参数需要重启数据库才能生效,没法用wal_keep_segments = 150 # 替换成你计算出的数值pg_reload_conf动态重载。 - 第三步:配合定时清理工具加固
仅靠wal_keep_segments不能完全规避归档失败的风险,你可以用PostgreSQL自带的pg_archivecleanup工具写一个定时任务,清理pg_xlog中已归档且超过48小时的文件。比如在crontab里添加每天执行的任务:
另外一定要确保你的归档脚本有错误处理机制,比如归档失败时发送邮件告警,这样能及时发现问题,避免WAL文件堆积。# 清理pg_xlog中48小时前的已归档WAL文件 0 0 * * * pg_archivecleanup /var/lib/pgsql/8.4/data/pg_xlog $(date -d "48 hours ago" +"%Y%m%d%H%M%S")
内容的提问来源于stack exchange,提问作者TSG
相关产品推荐
相关产品推荐

