面试题答案
一键面试重做日志(redo log)的功能
- 保证事务持久性:持久性要求一旦事务提交,其所做的修改就应永久保存。重做日志记录了数据库物理层面的修改操作,在事务提交时,将重做日志持久化到磁盘,即便系统崩溃,重启后也能根据重做日志恢复事务提交的修改,确保数据不丢失,从而满足事务持久性要求。
- 崩溃恢复:在数据库崩溃后,MySQL的InnoDB存储引擎利用重做日志来恢复未完成的事务并重新应用已提交事务的修改,使数据库恢复到崩溃前的状态,保证数据一致性。
重做日志的工作原理
- 记录时机:在事务执行过程中,InnoDB存储引擎会将每个修改数据页的操作记录到重做日志缓冲区(redo log buffer)。这些记录是物理格式的,记录了对数据页的具体修改。
- 写入磁盘时机:
- 事务提交时:默认情况下,当事务提交时,InnoDB会将重做日志缓冲区中的日志刷新到重做日志文件(redo log file)。这个过程通过
fsync
等系统调用将日志持久化到磁盘,确保日志不会因系统崩溃而丢失。 - 日志缓冲区满时:如果重做日志缓冲区已满,InnoDB也会主动将缓冲区中的日志刷新到重做日志文件。
- 定期刷新:InnoDB会按照一定的时间间隔(如每秒)将重做日志缓冲区中的日志刷新到重做日志文件。
- 事务提交时:默认情况下,当事务提交时,InnoDB会将重做日志缓冲区中的日志刷新到重做日志文件(redo log file)。这个过程通过
- 循环使用日志空间:重做日志文件通常是循环使用的,当一个重做日志文件写满后,会切换到下一个文件继续写入。通过这种方式,可以避免日志文件无限增长占用过多磁盘空间。
崩溃后数据的恢复
- 分析阶段:InnoDB存储引擎在崩溃恢复时,首先会扫描重做日志,确定哪些事务在崩溃前已经提交,哪些事务未完成。通过日志中的事务开始和提交标记来判断事务状态。
- 重做阶段:对于已经提交的事务,InnoDB会根据重做日志中的记录,重新应用这些事务对数据页的修改,将数据恢复到崩溃前已提交事务修改后的状态。
- 回滚阶段:对于未完成的事务,InnoDB会进行回滚操作,撤销这些事务对数据的修改,以保证数据一致性。回滚操作也是基于重做日志记录的反向操作来实现的。