我们知道mysql有三大日志,分别是redo log(重做日志),undo log(回滚日志),binlog(归档日志)。它们分别起到了什么作用,和它们究竟是什么,下面将会介绍面试会考察的点,如果需要详细了解的话可以去看看我们小林哥写的图解MYSQL
redo log
是 Innodb 存储引擎层生成的日志,实现了事务中的持久性,主要用于掉电等故障恢复;
日志由两部分组成:重做日志缓冲(redo log buffer)以及重做日志文件
ps:图源自小林图解
redo log是物理日志,记录了某个数据页发生了什么修改,有了 redo log,再通过WAL 技术,InnoDB 就可以保证即使数据库发生异常重启,之前已提交的记录都不会丢失,这个能力称为 crash-safe(崩溃恢复)。可以看出来, redo log 保证了事务四大特性中的持久性。
WAL 技术: WAL 技术指的是, MySQL 的写操作并不是立刻写到磁盘上,而是先写日志,然后在合适的时间再写到磁盘上
undo log
是 Innodb 存储引擎层生成的日志,记录的是逻辑日志,实现了事务中的原子性,主要用于事务回滚和 MVCC
我们每次在事务执行过程中,都记录下回滚时需要的信息到一个日志里,那么在事务执行中途发生了 MySQL 崩溃后,就不用担心无法回滚到事务之前的数据,我们可以通过这个日志回滚到事务之前的数据,那么这一机制就是undo log(回滚机制),保证事务的ACID特性中的原子性
实际例子: 当delete一条记录时,undo log会记录一条对应的insert记录,反之亦然
作用:
- 实现事务回滚,保障原子性(事务未提交前进行记录)
- 实现MVCC(多版本并发控制)关键因素之一:MVCC 是通过 ReadView + undo log 实现的。undo log 为每条记录保存多份历史数据,MySQL 在执行快照读(普通 select 语句)的时候,会根据事务的 Read View 里的信息,顺着 undo log 的版本链找到满足其可见性的记录。
binlog
Server 层生成的日志,主要用于数据备份和主从复制
MySQL 在完成一条更新操作后,Server 层还会生成一条 binlog,等之后事务提交的时候,会将该事物执行过程中产生的所有 binlog 统一写入 binlog 文件。 binlog 文件是记录了所有数据库表结构变更和表数据修改的日志,不会记录查询类的操作,比如 SELECT 和 SHOW 操作。