面试题答案
一键面试重做日志(redo log)在数据恢复中的作用
- 崩溃恢复(crash recovery):
- 当MySQL发生崩溃(如突然断电、系统故障等)后重启时,InnoDB存储引擎会使用重做日志来恢复未完成的事务,并使已提交的事务对数据的修改永久化。
- 重做日志记录了数据库物理层面的修改操作,例如某一页数据的修改。InnoDB按照重做日志记录的顺序重新执行这些操作,将数据库恢复到崩溃前的状态。
- 因为重做日志采用循环写的方式,空间使用完后会覆盖旧的日志,所以可以保证即使在崩溃后,只要日志没有被覆盖,就能进行恢复。
- 事务持久性(Durability)保证:
- 事务提交时,InnoDB会将该事务对应的重做日志刷盘(写入磁盘)。这确保了即使系统崩溃,已提交事务对数据的修改也不会丢失,从而满足事务的持久性要求。
回滚日志(undo log)在数据恢复中的作用
- 事务回滚(rollback):
- 当事务执行过程中出现错误或者主动执行ROLLBACK语句时,InnoDB会利用回滚日志将数据回滚到事务开始前的状态。
- 回滚日志记录了数据修改前的版本,例如插入操作对应的回滚日志会记录删除该记录的操作,更新操作对应的回滚日志会记录将数据恢复到更新前值的操作。通过反向执行这些记录的操作,实现事务回滚。
- 一致性读(consistent read):
- 在InnoDB的多版本并发控制(MVCC)机制中,回滚日志起到关键作用。当一个事务进行一致性读(例如使用READ COMMITTED或REPEATABLE READ隔离级别进行读取操作)时,InnoDB根据回滚日志构建出符合事务隔离级别的数据版本。
- 比如,在REPEATABLE READ隔离级别下,事务启动时会记录一个系统版本号(read - view),后续读取数据时,如果当前数据版本的修改在read - view创建之后,就从回滚日志中获取该数据之前的版本,以保证在事务内多次读取到的数据一致性。