面试题答案
一键面试关键组件
- 预写式日志(Write - Ahead Log,WAL):记录数据库的所有修改操作,是故障恢复的基础。每次事务对数据进行修改前,先将该修改操作记录到WAL日志中。
- 检查点(Checkpoint):定期将缓冲区中的脏数据(已修改但未持久化到磁盘的数据)刷新到磁盘,并在WAL日志中标记检查点记录。它能确定在故障恢复时需要重放的日志起点。
基本原理与大致流程
- 正常运行时
- 事务执行修改操作,先将修改记录写入WAL日志,确保日志已持久化到磁盘(fsync操作),然后才允许修改内存中的数据页。
- 检查点进程定期工作,将内存中脏数据页刷回磁盘,并在WAL日志中写入检查点记录,记录当前所有已提交事务的LSN(日志序列号,用于标识WAL日志中的位置)。
- 故障发生时
- 数据库崩溃后重启。
- 恢复流程
- 分析阶段:从WAL日志末尾开始向前扫描,找到最近的检查点记录。确定需要重放的日志起点,即检查点记录中记录的所有已提交事务的LSN。同时,构建一个事务表,记录哪些事务在崩溃时处于活跃状态(未提交)。
- 重做阶段(Redo):从分析阶段确定的日志起点开始,重放WAL日志中的记录,将已提交事务对数据页的修改重新应用到数据库缓冲区(内存),恢复崩溃前已提交事务对数据的修改。
- 撤销阶段(Undo):对分析阶段确定的处于活跃状态的事务,反向扫描WAL日志,撤销这些未提交事务对数据页的修改,保证数据库的一致性。在撤销完成后,数据库恢复到崩溃前的一致状态。