亲爱的 PostgreSQL 社区,我试图在内部更好地理解 PostgreSQL 检查点,所以我正在考虑这个场景。
假设 checkpoint_timeout 为 15 分钟,checkpoint_completion_target 为 0.85。现在,如果我们遇到这样一种情况:一个检查点由于某种原因需要 20 分钟,例如
下午 1:00 - 检查点 1 开始
下午 1:15 检查点超时已触发,但检查点 1 仍在运行(此处已安排检查点 2)
1:20PM - 检查点 1 完成
我的问题是下一个检查点会在下午 1:20 立即触发,还是会按照最初计划暂停并在 1:30 开始?我假设两个检查点不能重叠。(现在先不讨论其他影响参数,如max_wal_size,它也可以触发)
那么检查点 1 是否将所有脏缓冲区写入磁盘,因此我们在 1:20 处具有非常干净的状态,因此不需要启动第二个检查点?据我了解,旧的检查点不会触及启动后弄脏的页面,因此在这种情况下,新的检查点需要在旧的检查点完成后触发。
另外,checkpoint_timeout 调度会以任何方式切换吗?就像预定的晚点时间与前一个晚点的时间一样长,或者它是不可更改的吗?
如果您能分享有关内部见解的更多详细信息,我将非常高兴。
给定时间只能运行一个检查点,因此如果前一个检查点仍在进行中,则下一个检查点必须等到第一个检查点完成。第二个检查点应该在前一个检查点完成后立即开始。
第二个检查点可能要做的工作较少,但在第一个检查点正在进行时缓冲区可能会再次变脏,因此第二个检查点不会无所事事。
PostgreSQL 不会调整,但如果自最新检查点以来写入的内容
checkpoint_timeout
超过WAL,则会启动另一个检查点。max_wal_size
这个想法是限制崩溃恢复时间。