postgresql - wal_keep_segments 为什么是最小值而不是最大值?

标签 postgresql

根据 docs

wal_keep_segments (integer) Specifies the minimum number of past log file segments kept in the pg_xlog directory

与此同时,根据我的经验 - 您创建一个从站并将 wal_keep_segments 从默认值更改为 64,然后观察 xlog 的数量开始增长直到达到 64 个文件。我认为这是最大值,而不是最小值。

然后如果你创建了一个超过 16M*64=1GB 的事务,slave 就坏了,说它需要删除 WAL 文件。因为最大文件数比需要的少,对吧?.. 那么问题来了:为什么要MINIMUM?为什么不是 MAXIMUM

更新:AS 文档在第一句话中指出我在谈论流复制

These settings control the behavior of the built-in streaming replication feature

master,不是slave(没有级联复制)

18.6.1. Sending Server(s)

archive_command 是“什么都不做” cd . 并且 recovery.conf 中的 restore_command 没有设置完全

最佳答案

直接回答你的问题,为什么最小而不是最大?因为新的 WAL 段比 RemoveOldXlogFiles(_logSegNo, recptr) 函数删除旧的 WAL 段增长得更快。

另外,文档中计算WAL段可能数量的公式是错误的。我的 WAL 总是比 checkpoint_segments + wal_keep_segments + 1 更准确的公式是这样的:wal_keep_segments + 2 * checkpoint_segments + 1

这里有一篇老掉牙但非常好的帖子:http://www.postgresql.org/message-id/CAECtzeUeGhwCiNTishH=+kxhiepJsHu7EO0J6-LEVO-ek5oPkg@mail.gmail.com

如果您进行大量插入,您的 WAL 段的增长速度将快于它们被删除的速度。就在这周,我得到了这个。我希望 pg_xlog 保持相对恒定的大小。晚上有一个大型进程在运行,当我第二天早上开始工作时,我的 postgres 实例崩溃了,因为我安装的用来放置这些 WAL 的卷已经完全满了。 Postgres 填满了卷,试图写更多的 WAL,但不能,然后突然死了。幸运的是我们在 pgpool2 后面运行副本。

如果您有好奇心,我鼓励您浏览 postgres 源代码。它很大,而且是用 C 语言编写的,但是代码注释真的很有帮助。这个文件特别有启发性,因为它深入了解检查点如何工作以及如何删除旧的 WAL 段:https://github.com/postgres/postgres/blob/master/src/backend/access/transam/xlog.c

关于postgresql - wal_keep_segments 为什么是最小值而不是最大值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32116292/

相关文章:

ruby-on-rails - 我可以使用 Rails 将数组存储在 hstore 中吗

c++ - 服务器 API PostgreSQL : how to find the path to the database?

postgresql - 用于持久化PostgreSQL数据库数据的Docker卷

PostgreSQL、WAMP、Laravel 5.5 - "php artisan migrate"抛出 "driver not found"异常

postgresql - 空闲的 postgres 进程占用大量内存

postgresql - 从通用触发器中的不同列获取值

postgresql - 在 Postgresql 中按 DateTime 的日期分组

node.js - Sequelize +数据插入

ruby-on-rails - 初始查询后的 ActiveRecord 预加载

linux - postgres 中的 Max_connection