PostgreSQL码农集散地

补充: PG 恢复过程中的“LSN检查”

补充: PG 恢复过程中的“LSN检查”

上一篇文章提到的LSN有什么用, 有一点未详尽说明(甚至可能存在误导). 答群友 | PG Data Block中LSN的作用是什么?

本文补充如下.

“LSN检查”在恢复过程中有两个不同场景:

1. 一致性验证阶段

在xlogrecovery.c中的LSN检查是用于一致性验证,而非决定是否重做  。这个检查发生在:

  • 已经应用了WAL记录的页面
  • 需要验证页面内容是否与WAL记录一致

2. 重做决策阶段(实际的重做逻辑)

真正的重做决策在XLogReadBufferForRedo函数中处理  :

Image

Full Page Write机制

Full page write正是为了解决partial write问题  :

  1. 触发时机:checkpoint后第一次修改页面时
  2. 作用:将整个页面内容写入WAL,而非仅记录增量修改
  3. 恢复时:直接用full page image覆盖可能损坏的页面

协同工作流程

恢复时的完整流程:

  1. 读取WAL记录,检查是否包含full page image
  2. 如果有full page image:直接恢复整个页面,无需LSN检查
  3. 如果没有full page image:
    • 检查页面LSN是否 >= 记录LSN
    • 如果是,说明修改已应用,跳过
    • 如果否,应用增量修改

关键点

  • Full page write是预防措施:确保checkpoint后的第一次修改能完全恢复页面
  • LSN检查是优化措施:避免重复应用已完成的修改
  • 两者不冲突:full page write处理页面完整性,LSN检查处理重复应用问题

这就是为什么即使有partial write的风险,LSN检查逻辑仍然有效的原因  。

Notes

  • LSN检查代码是在特定验证场景下,不是通用的重做决策逻辑
  • Full page write机制确保了即使发生partial write,也能从WAL中完全恢复页面
  • 实际的重做决策在XLogReadBufferForRedo函数中,会优先使用full page image