内容来自《收割Offer:互联网大厂面经》

面试官提问

● 谈谈MySQL的3种核心日志redo、undo、binlog及其作用。

1 redo log

为了避免每次读写数据库都会产生随机 IO,InnoDB 为 MySQL 提供了 Buffer Pool,读取数据时先从 Buffer Pool 读取,数据不存在则从磁盘读取后再写入 Buffer Pool;数据写入时先写入 Buffer Pool,Buffer Pool 中的数据定期刷盘。Buffer Pool 提升了数据库的读写性能,但数据库一旦宕机,Buffer Pool 中缓存的数据若未刷盘就会丢失,因此,当数据变更时,还需要记录 redo log,redo log 是预写日志(Write-ahead logging,WAL),所有对数据的修改先写入 redo log,再更新到 Buffer Pool,如果MySQL 宕机,重启时可以读取 redo log,再更新到 Buffer Pool,如果 MySQL 宕机,重启时可以读取 redo log 对数据进行恢复。这里需要说明的是,不同于数据库操作产生的随机读写,写 redo 日志是顺序写,效率极高。

2 undo log

事务执行前,MySQL 会将更新前的数据保存到 undo 日志中,如果事务回滚或者数据崩溃,可以利用 undo 日志进行回退。undo log也可以用于实现多版本并发控制(MVCC)。

3 binlog

主从复制,从库利用主库上的 binlog 进行数据回放,实现主从同步。