You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL 12主库WAL文件过多占用大量磁盘空间问题咨询

核心结论
  • 已经完成归档、且被所有流复制备库接收重放、超出checkpoint保留范围的WAL文件,主库本地完全不需要留存。PostgreSQL默认的自动回收机制本来就会定期清理这部分文件,你现在出现6.4TB的WAL堆积,是自动回收的前置条件被卡住了,不是正常保留策略导致的。
  • 清理WAL有严格的操作规范,严禁直接用rm命令删除pg_wal目录下的文件,操作不当会直接导致数据库崩溃,必须先排查根因,再用官方工具安全处理。
第一步:排查WAL异常堆积的根因

你当前配置max_wal_size = 16GB,正常运行状态下pg_wal目录大小应该稳定在4GB~20GB区间,堆到6.4TB一定是以下两类问题导致,先排查根因再清理,避免清理后再次出现堆积:

  • 归档流程故障:在主库psql中执行SQL select * from pg_stat_archiver; 查看归档状态,重点关注failed_count(归档失败次数)、last_failed_wal(最后一次归档失败对应的WAL文件)、last_archived_wal(最后一次归档成功的WAL文件)。你当前配置的归档命令是先把WAL复制到本地/pgdata/wal_backup/目录,再执行backup_wal.sh脚本同步到备份服务器,常见故障点包括备份服务器不可达、同步脚本执行卡死、本地wal_backup目录权限配置错误、wal_backup所在磁盘满导致cp失败。只要归档命令持续返回失败,PostgreSQL会永久保留对应WAL文件不会做回收。
  • 流复制状态异常:先执行SQL select * from pg_replication_slots; 查看复制槽状态,如果存在active='f'的非活跃复制槽,就是槽位锁死了WAL回收逻辑——复制槽会强制保留所有备库未接收的WAL,哪怕备库已经断连数天,也会持续堆积WAL直到备库追平进度。再执行SQL select client_addr,state,replay_lsn,sent_lsn from pg_stat_replication; 查看在线备库的同步进度,如果存在备库的重放LSN和主库当前LSN差距过大,也会阻塞WAL回收。
第二步:安全清理冗余WAL释放空间

优先方案:修复故障后自动清理

把归档故障修复(比如修复备份同步脚本、恢复备份服务器连通性、修正目录权限)、删除失效的非活跃复制槽(执行select pg_drop_replication_slot('对应槽名');)、确认所有在线备库同步状态正常后,PostgreSQL会在下次checkpoint时自动回收所有不需要的WAL文件,无需人工干预。如果要立刻触发回收,可以在psql中手动执行checkpoint;,等待数分钟即可看到空间释放。

紧急方案:磁盘高水位时手动清理

如果当前磁盘使用率已经超过90%,等不及自动回收,可以用PostgreSQL自带的pg_archivecleanup工具安全清理,操作步骤如下:

  1. 确定安全删除的WAL截止点:取「最后一个成功归档的WAL文件名」和「所有在线备库中最小的已重放WAL文件名」二者中编号更大的那个,所有编号小于这个截止点的WAL文件,都已经完成归档、也被备库接收重放完毕,可以安全删除。

    注意:截止点不要设置过新,误删仍需使用的WAL会导致备库断连、基于时间点的恢复(PITR)失效。

  2. 执行清理命令,替换命令中的pg_wal目录路径和上一步查到的截止WAL文件名即可:
    # 示例:pg_wal目录为PG12默认路径,截止WAL文件为000000010000001200000034
    pg_archivecleanup /var/lib/pgsql/12/data/pg_wal/ 000000010000001200000034
    
  3. 清理完成后执行一次checkpoint;,确认磁盘空间正常释放。
后续优化配置,避免问题复现
  • 给归档命令加超时机制,避免脚本卡死阻塞WAL回收,把postgresql.conf中的archive_command修改为:
    archive_command = 'timeout 60 bash -c ''test ! -f /pgdata/wal_backup/%f && cp %p /pgdata/wal_backup/%f && /var/lib/pgsql/backup_wal.sh'''
    
    单条归档命令执行超过60秒直接返回失败,PostgreSQL会自动重试,不会一直卡着阻塞WAL回收。
  • 针对复制槽加严格监控:PostgreSQL 12没有复制槽WAL占用上限的配置参数,一旦存在非活跃复制槽就会无限堆积WAL,需要配置告警规则:当复制槽的active字段为f超过5分钟立刻通知运维处理,及时删除无效槽位。
  • 新增三项监控告警:当pg_wal目录大小超过32GB、归档失败次数大于0、存在非活跃复制槽时立刻触发告警,在磁盘占满前提前介入处理。

内容的提问来源于stack exchange,提问作者Zekeriya Akgül

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 03:18:16