wal_keep_segments为什么最小,不是最大?

时间:2015-08-20 10:52:05

标签: postgresql

根据docs

  

wal_keep_segments(整数)指定过去日志的最小数量   文件段保存在pg_xlog目录中

同时根据我的经验 - 你创建一个slave并从默认值更改wal_keep_segments让它为64,并观察随着xlogs的数量开始增长直到达到64个文件。我认为这是最大值,而不是最小值。

然后,如果你创建一个超过16M * 64 = 1GB的事务,奴隶就会被打破,说它需要删除WAL文件。因为MAXIMUM文件的数量少于需要的数量,对吧? 所以问题是:为什么 MINIMUM ?为什么不 MAXIMUM

更新:AS文档在第一句中说明我正在谈论流式复制

  

这些设置控制内置流媒体的行为   复制功能

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

  

18.6.1。发送服务器

archive_command是“无所事事”cd .restore_command中的recovery.conf根本没有设置

3 个答案:

答案 0 :(得分:8)

要直接回答您的问题,为什么最低限度,为什么不最大?因为新的WAL段可以比RemoveOldXlogFiles(_logSegNo, recptr)函数增长得快,所以可以删除旧的段。

另外,计算docs中可能的WAL段数的公式是错误的。我总是比checkpoint_segments + wal_keep_segments + 1多了几个WAL这个更准确的公式: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

答案 1 :(得分:3)

  

xlogs的数量开始增长,直到达到64个文件。   我认为这是最大值,而不是最小值。

不,这不是最大值。最大值的公式在文档中给出 http://www.postgresql.org/docs/current/static/wal-configuration.html

  

总会有至少一个WAL段文件,并且通常会   不超过(2 + checkpoint_completion_target)*   checkpoint_segments + 1或checkpoint_segments + wal_keep_segments + 1   文件。每个段文件通常为16 MB(尽管此大小可以是   在构建服务器时改变了)。您可以使用它来估计空间   对WAL的要求。

您提到的有关需要删除的WAL文件的从属设备的问题应该在上下文中查看,也就是说,如何配置日志传送或者根本没有配置它,以及您是否正在使用Hot Standby或Streaming Replication。

有关可能比主要文档更容易理解的解释,请参阅https://wiki.postgresql.org/wiki/Binary_Replication_Tutorial

答案 2 :(得分:1)

这是最小的,因为WAL文件是在你需要恢复的情况下保存的,它们可以在短时间内超过$formName = strtolower($_POST['formName']); $formPass = $_POST['formPass']; $con = new mysqli("localhost", "root", "Password1", "project"); if ($con->connect_errno) { printf("Connect failed: %s\n", $users->connect_error); exit(); }; $login = $con->prepare("SELECT userID FROM users WHERE userName=?"); $login->prepare("s", $formName); $login->execute(); $login->store_result(); if($login->num_rows > 0) { $login->bind_result($userID); while($login->fetch()) { $pass = $con->prepare("SELECT userPass FROM users WHERE userID=?"); $pass->bind_param("i", $userID); $pass->execute(); $pass->bind_result($userPass); while($pass->fetch()) { if(hash_equals($userPass, password_hash($formPass,$userPass))) { echo 'Correct Password'; } else { echo 'Incorrect password'; } }; $pass->close(); }; } else { echo 'Username not found'; }; $login->close(); ,但永远不会少,因为WAL文件的数量决定了备用服务器的数量在无法赶上之前落后。