如何安全删除PostgreSQL流复制归档目录下的旧归档文件
PostgreSQL流复制环境下安全清理归档日志的操作方法
清理归档日志的核心原则是确保要删除的归档日志已经被所有需要的备库应用完成,且不再需要用于基础备份恢复,禁止随意手动删除,避免出现主备同步中断、数据无法恢复的故障。
方法1:使用官方自带pg_archivecleanup工具(最推荐)
该工具是PostgreSQL原生提供的专门清理归档的工具,会自动过滤掉仍需要使用的WAL文件,不会误删有效数据。
- 手动指定保留边界清理:
首先确认你要保留的最早有效WAL文件名(可以从最近的基础备份backup_label文件、主库pg_current_wal_lsn()转换结果、备库同步状态中查询获取),比如要保留所有比000000010000000F000000A3新的归档,执行命令:pg_archivecleanup /your/archive/dir/path 000000010000000F000000A3 - 备库自动清理:
如果你希望备库应用完归档后自动清理旧文件,可以修改备库的恢复配置:- PostgreSQL 11及更早版本:在
recovery.conf中修改restore_command参数 - PostgreSQL 12及更高版本:在
postgresql.conf中修改restore_command参数
配置示例:restore_command = 'cp /your/archive/dir/path/%f %p && pg_archivecleanup /your/archive/dir/path %r'
其中%r是PostgreSQL自动传入的备库当前所需最早WAL文件名,会自动删除早于该版本的所有归档,无需人工干预。
- PostgreSQL 11及更早版本:在
方法2:基于基础备份周期清理
如果你定期做基础备份,仅需要保留最近N个备份对应的归档用于恢复:
- 找到你要保留的最早的基础备份,打开备份中的
backup_label文件,找到START WAL LOCATION对应的WAL文件名 - 用上述
pg_archivecleanup工具,将该WAL文件名作为保留边界执行清理即可
可选:按时间批量清理(高风险,需谨慎操作)
如果你明确你的归档仅需要保留指定天数,且确认该天数之前的归档已经不需要用于主备同步、PITR时间点恢复,可以用find命令批量删除,比如删除14天前的归档文件:find /your/archive/dir/path -type f -mtime +14 -name "000000*" -delete
警告:该方法风险较高,执行前务必确认你已经做了最新的全量备份,且要删除的归档确实没有使用需求。
注意事项
- 如果你的架构有多个备库,必须确认所有备库都已经应用完要删除的归档,再执行清理操作,否则会导致备库同步中断
- 如果开启了PITR能力,需要按照你的业务恢复窗口要求保留对应时长的归档,不要删除恢复窗口内的归档文件
- 清理前建议先做一次全量基础备份,避免误操作导致数据无法恢复
内容的提问来源于stack exchange,提问作者bocah
相关产品推荐
相关产品推荐

