知识卡片

检查点机制降低恢复扫描范围

普通读书笔记卡

内容

[[基于日志的恢复:先写日志原则与undo/redo操作]]有一个隐藏的效率 问题:如果系统运行了很长时间才崩溃,恢复时理论上要扫描从最早时刻 开始的整份日志、对所有已提交事务全部redo一遍——但绝大部分早期 事务的修改结果早就已经安全落盘了,重做它们纯粹是浪费时间,不会有 任何错误后果,只是拖慢恢复速度。检查点机制解决的正是这个”重做 了太多本不需要重做的内容”的问题:系统周期性地在某个时刻执行一次 检查点操作,把当前内存里所有未写入磁盘的日志记录和缓冲区数据强制 落盘,再在日志里追加一条checkpoint标记——这个标记本质是在向未来 的恢复过程承诺”在这个时间点之前提交的事务,其结果确实已经写进 数据库了,不需要再重做”。恢复时因此不再需要从日志最开头扫起,而是 先找到离故障时刻最近的一个检查点,把数据库状态直接当作已经恢复到 检查点时刻,只需要逆向扫描从检查点到故障发生这一小段日志,就能 确定这段时间内哪些事务需要redo(检查点之后才提交的)、哪些需要 undo(检查点之后开始但还未提交的)——把恢复的工作量从”整个数据库 运行历史”压缩到”最近一个检查点周期”,这正是检查点存在的核心价值。

参考来源

- 位置:《数据库原理(微课版)》第11章《事务处理技术》11.5.2节"检查点" (源文件:_epub-src/index_split_007.html) - 结论依据:原文明确"一个数据库系统有可能正常运行了很长时间,那么 一旦需要恢复,就需要搜索整个日志文件,redo大量之前已提交的事务 ……大量已提交的修改操作已写入数据库,重做不会生成不良后果,但会 消耗不必要的时间且会拖慢恢复的进度""扫描日志文件,查找距离故障 时刻最近的检查点,将数据库恢复到检查点生成时刻的状态。逆序扫描 从检查点到故障时刻之间的一段日志文件,确定需要redo、undo的事务", 因此可以推出检查点机制如何压缩恢复所需扫描的日志范围。 - 原始内容:一个数据库系统有可能正常运行了很长时间,那么一旦需要 恢复,就需要搜索整个日志文件,redo大量之前已提交的事务……大量 已提交的修改操作已写入数据库,重做不会生成不良后果,但会消耗 不必要的时间且会拖慢恢复的进度。