“模糊检查点缩短 Analysis 起点,却不要求停机或刷净脏页;CLR 让 Undo 的进展自身也受 WAL 保护。两者不是附加优化口号,而是算法能在高并发与重复崩溃中保持正确的状态接口。”
形式陈述 ​
模糊检查点允许事务更新、提交与缓冲页写回在检查点期间继续。以 预写日志 为基础,系统先写 BEGIN_CHECKPOINT,随后收集并写入 END_CHECKPOINT;后者至少携带:
- Transaction Table:活跃事务的状态与
lastLSN; - Dirty Page Table:可能尚未落盘的页及各自
recLSN。
检查点完成记录稳定后,master record 才原子地指向这次完整检查点的起始位置。崩溃恢复从该位置开始,把检查点内容与之后扫描到的日志合并;它不能直接把表当成崩溃瞬间的最终状态。
“模糊”表示收集期间系统未静止,两个表甚至未必对应同一物理瞬间。正确算法采用保守合并:DPT 对同一页保留足够早的 recLSN,Transaction Table 不用较旧状态覆盖扫描中看到的更新。ARIES随后用完整 Analysis 重建崩溃点状态。
对同一页,检查点给出的 recLSN 与扫描中已有值合并时取不会漏掉更新的较小者;对事务状态,则保持更先进的 COMMIT/ABORT/END 信息。合并规则必须逐字段定义,简单用 END_CHECKPOINT 整表覆盖当前结果是不可靠的。
检查点不要求把所有脏页刷盘。后台可以顺便清理部分页以缩短未来 redo,但正确性来源是日志与表的边界,而不是“检查点之后磁盘等于内存”。
直觉
传统静止检查点像关门盘点:停止营业、摆平所有货架再记账。模糊检查点像营业中拍摄一组带时间标记的库存照片。单张照片可能落后,但只要记录从哪里继续看流水账,恢复者就能把照片与后续事件拼成完整现场。
它换取更短停顿,却没有免费消除工作。检查点越旧、DPT 越大,重启扫描和 redo 候选越多;检查点过密又增加日志与采集开销。
检查点更像恢复书签,不是持久性分界线。事务 commit 仍由自己的日志刷盘规则决定,页是否能淘汰仍由 WAL 决定;书签只让 Analysis 不必从日志开头重建全部状态。
例子与边界
检查点开始前,DPT 含 lastLSN=90。系统写
100: BEGIN_CHECKPOINT
110: T4 UPDATE R
120: END_CHECKPOINT {TT snapshot, DPT snapshot}
采集线程可能在 LSN 110 前已经复制 Transaction Table,因而 END 记录里没有
只有 LSN 120 已稳定后,master 才改指向 100。若在此之前崩溃,旧 master 仍指向上一个完整检查点,恢复多扫描一段日志但不使用半次检查点。若 master 指针本身可能撕裂,还需双副本、校验或底层原子写保证。
只记录 DPT 不够:恢复还要知道哪些事务活跃、已提交或正在回滚,才能选出 loser 和 undo 起点。反过来,只记录 Transaction Table 也无法确定 redo 应从哪个页的哪条日志开始。
若检查点采集期间页
推论与应用
模糊检查点把恢复时间控制变成可调参数。系统可按日志量、脏页量或时间触发,并通过后台刷写推进 DPT;这些策略影响成本,不改变 BEGIN/END 稳定顺序与两张表的最低信息要求。
监控“最近检查点 LSN”时应区分 begin、end 和 master 已发布的位置。仅看到 BEGIN 记录不能宣称检查点可用;仅看到大量页已刷盘也不能替代事务状态。故障注入应覆盖采集期间、END 刷盘前后与 master 切换前后。
检查点日志本身也会占空间。截断旧日志前,系统要同时考虑最早脏页 recLSN、仍需 undo 的事务链、备份与复制消费者;“已有新检查点”不保证此前所有日志都可立即删除。
参考资料
- C. Mohan et al., “ARIES: A Transaction Recovery Method Supporting Fine-Granularity Locking and Partial Rollbacks Using Write-Ahead Logging,” ACM Transactions on Database Systems 17(1), 1992, pp. 94–162。
- Jim Gray and Andreas Reuter, Transaction Processing: Concepts and Techniques, Morgan Kaufmann, 1992, Ch. 11。
- Philip A. Bernstein, Vassos Hadzilacos, and Nathan Goodman, Concurrency Control and Recovery in Database Systems, Addison-Wesley, 1987, recovery chapters。