补充: PG 恢复过程中的“LSN检查”
补充: PG 恢复过程中的“LSN检查”
上一篇文章提到的LSN有什么用, 有一点未详尽说明(甚至可能存在误导). 答群友 | PG Data Block中LSN的作用是什么?
本文补充如下.
“LSN检查”在恢复过程中有两个不同场景:
1. 一致性验证阶段
在xlogrecovery.c中的LSN检查是用于一致性验证,而非决定是否重做 。这个检查发生在:
已经应用了WAL记录的页面 需要验证页面内容是否与WAL记录一致
2. 重做决策阶段(实际的重做逻辑)
真正的重做决策在XLogReadBufferForRedo函数中处理 :
Full Page Write机制
Full page write正是为了解决partial write问题 :
触发时机:checkpoint后第一次修改页面时 作用:将整个页面内容写入WAL,而非仅记录增量修改 恢复时:直接用full page image覆盖可能损坏的页面
协同工作流程
恢复时的完整流程:
读取WAL记录,检查是否包含full page image 如果有full page image:直接恢复整个页面,无需LSN检查 如果没有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