2020年6月20日 作者 zeroheart

mysql的三种日志

redo log、bin log、undo log

先说一下,redo log和undo log是innodb引擎级别的东西,binlog是mysql级别的

redo log 保证了持久性

undo log保证了原子性

binlog用来恢复数据和同步数据

我们先说一下binlog,binlog主要记录了数据的修改操作,create、insert、update等,不包含select,可以从binlog文件中,看到sql语句。所以是记录了修改的逻辑,主从数据库同步数据,数据库恢复数据都是用的binlog。

redo log是在数据写入磁盘之前,先写的一份数据,有了redo log,如果mysql服务挂了,可以恢复数据到磁盘。之前说binlog记录了修改的逻辑,mysql的基本存储结构式页,redo log可以说是直接记录着xx页做了xx修改,所以文件较小,恢复数据很迅速,redo log写入数据到磁盘中间也有buffer,是顺序io的。

redo log不会记录修改的历史,只有修改的结果,所以如果要恢复某个数据,只能使用binlog。

mysql需要保证redo log和binlog的结果一致,所以有了一个二阶段提交。redo log写完之后,进入prepare状态,binlog写完进入commit状态。每个事务binlog的末尾,会记录一个XID event,标志着事务是否提交成功,也就是说,恢复过程中,binlog最后一个 XID event 之后的内容都应该被 purge。(好像是XA事务,回头在整理下事务的内容),后来确认了,这里是内部XA事务。

至于undo log,用来实现回滚(原子性)和MVCC,记录的是操作逻辑,如果当前执行力insert,那么undo log会记录一个delete,如果是update,那么记录一个反向的update。一致性的非锁定读就是undo log的MVCC实现的。

mysql默认的隔离级别是read repeatable如果有事务占用某条记录,那么其他事务读取到的总是事务开始时候的版本。对于RC的隔离级别,读到的记录总是最新的记录。