postgres-wal-full

PostgreSQL WAL 占满磁盘的定位与处理

现象

报 could not write to file "pg_wal/..."、No space left on device,数据库变为只读或无法写入。pg_wal 目录持续增长,常见于复制槽或归档失败。

快速定位

SELECT slot_name, active, restart_lsn,
       pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn)) AS retained
FROM pg_replication_slots;

SELECT * FROM pg_stat_archiver;
SELECT * FROM pg_stat_replication;
SHOW archive_command;
df -h
du -sh $PGDATA/pg_wal
ls -lt $PGDATA/pg_wal | head

常见根因

  1. 复制槽对应的副本长期离线,WAL 无法回收。
  2. archive_command 失败,归档积压。
  3. 备库延迟或断连,wal_keep_size 保留过多。
  4. 大批量写入/索引构建导致 WAL 暴增。
  5. 磁盘容量规划不足。

修复

相关命令