面试题答案
一键面试- 恢复过程概述
- MySQL重启后,首先会读取InnoDB的重做日志(redo log)。因为InnoDB存储引擎是崩溃恢复(crash - safe)的,它会利用重做日志将未完成的事务回滚,并将已提交的事务重新应用,使数据库恢复到崩溃前的状态。
- 接着,MySQL会读取二进制日志(Binlog)。根据Binlog中的记录,MySQL会按照顺序重新执行在崩溃前已经提交的事务,确保主从复制和数据备份等功能的数据一致性。
- InnoDB redo log恢复原理
- 事务状态标记:InnoDB在事务执行过程中,会在redo log中记录每个修改操作。同时,事务有不同的状态,如未提交(uncommitted)和已提交(committed)。
- 回滚未完成事务:在恢复时,InnoDB通过检查redo log中的事务状态,找到所有未提交的事务。对于这些事务,InnoDB会根据redo log中的反向记录(undo log也有参与,但这里主要强调redo log对未完成事务回滚的引导),将数据库回滚到事务开始前的状态。
- 重新应用已提交事务:对于已提交的事务,InnoDB会按照redo log中记录的操作顺序,重新应用这些修改。redo log是循环写的日志,它记录了数据页的物理修改,通过这些记录可以将数据页恢复到崩溃前已提交事务执行后的状态。
- Binlog恢复原理
- 主从复制与数据备份基础:Binlog记录了数据库的逻辑修改,它是顺序写的日志。在崩溃恢复完成InnoDB层面的恢复后,MySQL会读取Binlog。
- 基于Binlog重放:MySQL会从Binlog的起始位置开始,按照记录的顺序重新执行已经提交的事务。这一步确保了即使在崩溃恢复过程中,由于各种原因(如redo log部分损坏等极端情况)导致InnoDB恢复的状态与实际完全一致,Binlog也能保证数据的最终一致性。在主从复制场景下,从库也是通过读取主库发送过来的Binlog并应用来保持与主库的数据同步。