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

PostgreSQL12主从流复制环境主库pg_wal占满不清理问题求助

PostgreSQL 12主库pg_wal日志未自动清理问题排查方案

以下为RHEL 7.8环境下、主从流复制运行正常、archive_mode关闭前提下的排查解决步骤:

1. 检查失效复制槽

  • 执行查询确认复制槽状态:
    select slot_name, slot_type, active, restart_lsn from pg_replication_slots;
    
  • 若存在非active状态的复制槽,且restart_lsn远落后于当前最新LSN(可通过select pg_current_wal_lsn();查询),说明失效槽持有旧WAL文件未释放,导致无法清理。
  • 处理:确认槽不再使用后执行select pg_drop_replication_slot('失效槽名称');删除。

2. 检查wal_keep_size参数配置

  • PostgreSQL 12使用wal_keep_size替代原wal_keep_segments参数,查询当前配置:show wal_keep_size;
  • 若参数设置过大(如超过16GB),会导致主库强制保留远超实际需要的WAL文件。
  • 处理:根据从库延迟情况调整为4~8GB即可覆盖绝大多数场景,修改后执行select pg_reload_conf();重载配置生效。

3. 排查异常长事务/预备事务

未结束的长事务、2PC预备事务会阻止WAL回收,执行以下查询排查:

-- 查询运行超过1小时的长事务
select pid, usename, now()-xact_start as xact_duration, query 
from pg_stat_activity 
where state<>'idle' and now()-xact_start > interval '1 hour' 
order by xact_duration desc;

-- 查询未提交的预备事务
select gid, prepared, owner, transaction from pg_prepared_xacts;
  • 处理:确认无效事务后,执行select pg_terminate_backend(事务PID);终止长事务,预备事务执行ROLLBACK PREPARED '对应gid';回滚。

4. 检查pg_wal目录异常文件

如果运维过程中手动向pg_wal目录写入过临时文件、备份文件,PostgreSQL的自动清理逻辑不会删除非自身生成的非WAL格式文件,会导致目录占用持续上涨。

  • 处理:确认pg_wal下的文件是否符合00000001000000XX000000XX的WAL命名规则,无关文件手动移出目录即可。

5. 手动触发清理验证

上述问题修复后,可手动切换WAL触发清理逻辑:select pg_switch_wal();,执行后观察pg_wal目录占用是否回落,若仍未清理可查看PostgreSQL运行日志定位具体报错。

内容的提问来源于stack exchange,提问作者Sourabh Saha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 01:06:04