面试题答案
一键面试从崩溃到恢复数据的完整流程
- 启动MySQL服务:服务器重启后,启动MySQL服务,MySQL会检测到数据库发生崩溃。
- 恢复日志分析:InnoDB存储引擎开始分析重做日志(redo log)。重做日志记录了数据库发生的所有修改操作。
- 重做阶段:根据重做日志中的记录,InnoDB将尚未完成的事务回滚,并将已提交的事务重新应用,使数据库恢复到崩溃前的状态。
- 回滚未提交事务:对于崩溃时未完成的事务,InnoDB利用回滚日志(undo log)来撤销这些事务对数据的修改,确保数据一致性。
- 数据文件恢复:在完成重做和回滚操作后,数据库的数据文件和日志文件达到一致状态,数据库恢复完成,可正常提供服务。
InnoDB存储引擎确保数据一致性和完整性的机制
- 重做日志(redo log):记录数据库物理层面的修改操作。崩溃恢复时,通过重做日志将已提交事务的修改重新应用,保证已提交事务的持久性,确保即使系统崩溃,已提交的数据不会丢失。
- 回滚日志(undo log):记录数据修改前的版本,用于事务回滚。在崩溃恢复时,对于未完成的事务,利用回滚日志撤销其修改,保证数据一致性。同时,在MVCC(多版本并发控制)机制中,undo log为旧版本数据提供支持,保证读操作可以看到一致性视图。
- 检查点(Checkpoint):定期将内存中已修改的数据页刷新到磁盘,更新日志文件中的检查点位置。崩溃恢复时,只需从检查点开始重做日志,减少恢复时间,提高恢复效率,同时确保数据的一致性和完整性。
- 双写缓冲(Doublewrite Buffer):在将数据页写入数据文件之前,先将其写入双写缓冲区(共享表空间的一部分),然后再从双写缓冲区写入数据文件。如果在写入数据文件过程中发生崩溃,可从双写缓冲区恢复数据页,保证数据页的完整性。