0

我正在尝试了解我在 PostgreSQL 环境中的 wals 行为。我的沃尔设置是:

wal_keep_segments = 200
max_wal_size = 3GB
min_wal_size = 80MB
archive_command = 'cp %p /PostgreSQL-wal/9.6/pg_xlog/wal_archives/%f' 
archive_timeout = 10
#checkpoint_flush_after = 256kB
#checkpoint_completion_target = 0.5

我的 wals 目录是/PostgreSQL-wal/9.6/pg_xlog/,我的档案目录是PostgreSQL-wal/9.6/pg_xlog/wal_archives. 昨晚我的 wals 目录存储已满(存档目录也因为它们在同一个文件系统上)。

我的 wals 目录中现在有 211 个 wals:

ls -l /PostgreSQL-wal/9.6/pg_xlog/ | wc -l
212

唯一在夜间运行的只是从我们的监控代理中选择的。我猜想 wal 是因为 archive_timeout 非常低而被创建的,而它们被删除是因为 wal_keep_segments 很高。

今天早上,我将 wal_keep_segments 设置为 100,并将 archive_timeout 设置为 6 分钟。现在,在设置这些设置并启动集群 wals 开关后工作正常,我没有看到创建了很多 wals。但是,不应该自动删除旧的wals吗?我可以安全地删除档案吗?

4

1 回答 1

4

max_wal_size不是硬性限制。

当超出限制时,PostgreSQL 将在下一个检查点删除而不是回收旧的 WAL 段。所以pg_xlog仍然可以增长到下一个检查点。

您的 3 GB 设置对应于 192 个 WAL 段,低于您的wal_keep_segments设置。所以 PostgreSQL 甚至不会开始回收或删除 WAL 段,直到它们达到 3.125 GB。

您应该降低这些设置或增加 WAL 存档的磁盘空间。

您可以等到数据库活动导致切换到新的 WAL 段pg_switch_wal(),也可以手动调用该函数。然后等待检查点或CHECKPOINT手动运行。然后你会看到 WAL 段的数量减少了。

于 2017-11-20T09:17:52.950 回答