提问人:Bylaw 提问时间:3/7/2023 更新时间:3/17/2023 访问量:384
PostgreSQL - 不同 WAL 级别的检查点间隔行为
PostgreSQL - checkpoint interval behaviour in different WAL levels
问:
我无法为我的担忧找到一个明确的答案,所以我不妨向你们问问!
长话短说:我们需要在大约 400M 行上执行 UPDATE 命令。我知道该命令可以修改为批量工作,但这是一个不同的主题。我们的问题是WAL变得太大,我们用完了磁盘空间。 我想知道检查点间隔如何与不同的 WAL 级别一起工作。简单地说,文档说,较长的检查点间隔“触发”的整页写入次数较少,从而导致 WAL 较小。我找不到的是这种变化在不同的wal_level设置下的行为方式。
数据库版本:Postgres14.4的
1. 它与最小的
wal_level设置有什么关系吗? (考虑到它几乎删除了所有日志记录。
2. 当wal_level设置为副本或更高时,是否会破坏副本
? (根据不同的文章和文档,这对我来说并不明显,但我认为副本应该没问题,因为尽管整页/块写入较少,但所有更改都会被记录下来,而且它也可能是有益的,即减小 WAL 大小。
我们处于可以完全备份和关闭相关应用程序的位置,因此wal_level设置可以工作,但我也对不同的解决方案感兴趣,请随时分享一些想法。minimal
干杯!
答:
wal_level = minimal
不会有什么不同。只要您不将其设置为 ,PostgreSQL 就应该产生大约相同数量的 WAL。如果设置为低于 的值,它将中断复制。logical
wal_level
replica
显而易见的解决方案是添加更多磁盘空间。如果问题出在 WAL 存档上,则可以禁用 .如果问题是检查点需要很长时间才能完成,则可以运行手动命令。archive_mode
CHECKPOINT
增加以减少写入的 WAL 量。是的,我知道这听起来很奇怪,但并不控制 的大小,但它会触发检查点(这会增加写入的整页图像的数量)。max_wal_size
max_wal_size
pg_wal
评论
checkpoint_timeout
max_wal_size
它与最小的wal_level设置有什么关系吗?(考虑到它几乎删除了所有日志记录。
事实并非如此。使用 minimal,您只需跳过一些事情的 WAL 日志记录,例如将 COPY 复制到在同一事务中创建或截断的表中,或者创建索引。这些特殊情况不适用于批量更新。
要解决这个问题,你首先需要弄清楚根本问题是什么。在正常情况下,你是否如此接近太空状态,以至于任何压力都无法将你推倒?您是否有复制槽,而备用插槽无法跟上?你有跟不上的archive_command吗?您的 IO 系统是否不堪重负,以至于检查点无法及时完成,尽管它们尽可能快地尝试?您是否max_wal_size写硬盘无法兑现的支票?
评论
确保以下几点:
- 而且不会太小。
checkpoint_time
max_wal_size
- 你正在工作。
archive_command
这些要点对于避免淹没 I/O 系统非常重要。
评论