排查 pg_wal 目录增长

本页目录

$PGDATA/pg_wal 目录包含 WAL 文件。WAL (预写式日志) 是用于备份、恢复以及物理复制和逻辑复制的核心机制。

在某些情况下,pg_wal 目录大小会持续增长,这可能会引发担忧,因为它会增加磁盘空间耗尽的风险。

以下是排查增长中的pg_wal目录问题的步骤。

步骤1:检查复制槽

未使用或滞后的复制槽会阻止 WAL 文件被回收,因此 pg_wal 目录的大小会增加。在主库上检查:

SQL
select
  pg_size_pretty(pg_current_wal_lsn() - restart_lsn) as lag,
  slot_name,
  wal_status,
  active
from pg_replication_slots
order by 1 desc;

参考文档:The view pg_replication_slots

步骤2:检查archive_command是否正常工作

如果配置了 archive_mode 和 archive_command 来归档 WAL 文件 (例如用于备份),但 archive_command 失败 (返回了一个非零的退出代码) 或滞后 (WAL 的生成速率超过归档速度),这可能是 pg_wal 增长的另一个原因。

如何监控和排查:

一旦确定了问题,archive_command 需要修复或提升速度 (例如,启用 wal_compression = on,增加 max_wal_size 以减少 WAL 数据的生成;同时,在归档工具中使用较轻的压缩方式 — 具体取决于 archive_command 中使用的工具。例如,WAL-G 支持多种压缩选项,使用的 CPU 强度不同)。

接下来的两个步骤是附加的,因为它们对 pg_wal 大小增长的影响有限 — 它们只会导致一定数量的额外 WAL 文件保存在 pg_wal 中 (不像我们前面讨论的两种原因,它们可能会导致更大的影响)。

步骤3:检查wal_keep_size

在某些情况下,wal_keep_size (PG13+ 文档;在 PG12 及更早版本中,请参照 wal_keep_segments) 被设置为较大的值。当使用复制槽时,通常不需要使用这个机制 — 这是在复制槽机制出现之前的旧方法,用于避免某些 WAL 文件被删除,导致滞后的副本无法跟上。

步骤4:检查max_wal_size和checkpoint_timeout

当成功的检查点发生时,Postgres 可以删除旧的WAL文件。在某些情况下,如果调整了检查点设置以减少检查点的频率,这可能会导致存储在 pg_wal 中的 WAL 文件要多于预期。如果这对磁盘空间造成问题 (特别是在小型服务器上),可以考虑将 max_wal_size 和 checkpoint_timeout 设置为较低的值。在某些情况下,手动执行 CHECKPOINT 命令也是合理的,以便 Postgres 立即清理一些旧文件。

总结

最重要的检查项:

此外:

讨论与补充

在 GitHub 查看讨论

支持作者

感谢支持 PostgreSQL Howto 的长期维护。

微信赞赏码

读者交流群

二维码若已过期,可通过公众号 PostgreSQL 学徒或邮件联系。

PostgreSQL 学徒读者交流群二维码