PostgreSQL - 不同 WAL 级别的检查点间隔行为

PostgreSQL - checkpoint interval behaviour in different WAL levels

提问人:Bylaw 提问时间:3/7/2023 更新时间:3/17/2023 访问量:384

问:

我无法为我的担忧找到一个明确的答案,所以我不妨向你们问问!

长话短说:我们需要在大约 400M 行上执行 UPDATE 命令。我知道该命令可以修改为批量工作,但这是一个不同的主题。我们的问题是WAL变得太大,我们用完了磁盘空间。 我想知道检查点间隔如何与不同的 WAL 级别一起工作。简单地说,文档说,较长的检查点间隔“触发”的整页写入次数较少,从而导致 WAL 较小。我找不到的是这种变化在不同的wal_level设置下的行为方式。

数据库版本:Postgres14.4的

1. 它与最小的wal_level设置有什么关系吗? (考虑到它几乎删除了所有日志记录。

2. 当wal_level设置为副本或更高时,是否会破坏副本 (根据不同的文章和文档,这对我来说并不明显,但我认为副本应该没问题,因为尽管整页/块写入较少,但所有更改都会被记录下来,而且它也可能是有益的,即减小 WAL 大小。

我们处于可以完全备份和关闭相关应用程序的位置,因此wal_level设置可以工作,但我也对不同的解决方案感兴趣,请随时分享一些想法。minimal

干杯!

PostgreSQL 数据库复制 WAL 检查点

评论


答:

1赞 Laurenz Albe 3/7/2023 #1

wal_level = minimal不会有什么不同。只要您不将其设置为 ,PostgreSQL 就应该产生大约相同数量的 WAL。如果设置为低于 的值,它将中断复制。logicalwal_levelreplica

显而易见的解决方案是添加更多磁盘空间。如果问题出在 WAL 存档上,则可以禁用 .如果问题是检查点需要很长时间才能完成,则可以运行手动命令。archive_modeCHECKPOINT

增加以减少写入的 WAL 量。是的,我知道这听起来很奇怪,但并不控制 的大小,但它会触发检查点(这会增加写入的整页图像的数量)。max_wal_sizemax_wal_sizepg_wal

评论

0赞 Bylaw 3/8/2023
感谢您的回答!增加max_wal_size确实有意义,我们会尝试一下!它基本上和增加的checkpoint_interval一样,对吧?
0赞 Laurenz Albe 3/8/2023
在某种程度上。高不会有效果,除非你增加。但是,是的,两者都朝着减少检查点的方向发展。checkpoint_timeoutmax_wal_size
0赞 Bylaw 3/9/2023
我们也尝试使用更大的max_wal_size,但 WAL 再次增加到出乎意料的高尺寸。@jjanes如前所述,可能整个 update 命令及其部分进入 WAL 并保留在那里,直到事务提交。我不得不选择明显的解决方案,即将更新切成更小的批次。像这样,WAL将有时间自行清空和/或被真空清除。谢谢你的回答,这很有用!
0赞 Laurenz Albe 3/9/2023
我仍然不太确定问题出在哪里。WAL 会在下一个检查点被删除,无论您生成多少。或者您是在谈论存档的 WAL?
1赞 Bylaw 3/9/2023
奇怪!我相信你,但我不知道发生了什么。就像我说的,我唯一能想到的是 PITR 以某种方式影响了 WAL。我没有更多的时间尝试,所以我选择了带有 LOOP 的 DO 块,它以较小的批量更新。这立即解决了问题,现在 WAL 大小保持在非常低的水平。
0赞 jjanes 3/8/2023 #2

它与最小的wal_level设置有什么关系吗?(考虑到它几乎删除了所有日志记录。

事实并非如此。使用 minimal,您只需跳过一些事情的 WAL 日志记录,例如将 COPY 复制到在同一事务中创建或截断的表中,或者创建索引。这些特殊情况不适用于批量更新。

要解决这个问题,你首先需要弄清楚根本问题是什么。在正常情况下,你是否如此接近太空状态,以至于任何压力都无法将你推倒?您是否有复制槽,而备用插槽无法跟上?你有跟不上的archive_command吗?您的 IO 系统是否不堪重负,以至于检查点无法及时完成,尽管它们尽可能快地尝试?您是否max_wal_size写硬盘无法兑现的支票?

评论

0赞 Bylaw 3/9/2023
我不知道最小的wal_level。它与我们在尝试不同设置但未成功时获得的结果一致。没有副本,存档也已关闭。我们可以想到的另一件事是,某些东西在后台触发了 PITR 机制,并使日志记录非常详细。无论如何,我编写了一个批量更新的脚本,因此 WAL 将有时间和空间来清空。
0赞 Jessé Filho 3/17/2023 #3

确保以下几点:

  • 而且不会太小。checkpoint_timemax_wal_size
  • 你正在工作。archive_command

这些要点对于避免淹没 I/O 系统非常重要。