纯手绘图解 - MySQL undo log、redo log、binlog

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了纯手绘图解 - MySQL undo log、redo log、binlog相关的知识,希望对你有一定的参考价值。

参考技术A 这是一条非常简单的SQL语句[update student set score=100 where score=50],从mysql服务端接收SQL到写入磁盘,经过了Server层和InnoDB存储引擎,中间掺杂着磁盘读取、日志记录、内存更新、写入磁盘。

MySQL为什么将Server层和引擎层拆分?

MySQL主要包含2种存储引擎

MySQL Undo Log 撤销日志

Thresh

Undo:意为撤销或取消,以撤销操作为目的,返回指定某个状态的操作。

Undo Log

数据库事务开始之前,会将要修改的记录存放到 Undo 日志里,当事务回滚时或者数据库崩溃时,可以利用 Undo 日志,撤销未提交事务对数据库产生的影响。

Undo Log产生和销毁
Undo Log在事务开始前产生;事务在提交时,并不会立刻删除undo log,innodb会将该事务对应的undo log放入到删除列表中,后面会通过后台线程purge thread进行回收处理。
Undo Log属于逻辑日志,记录一个变化过程。例如执行一个delete,undolog会记录一个insert;执行一个update,undolog会记录一个相反的update。

Undo Log存储
Undo log采用段的方式管理和记录。在innodb数据文件中包含一种rollback segment回滚段,内部包含1024个undo log segment。可以通过下面一组参数来控制Undo log存储。

show variables like \'%innodb_undo%\'; 

Undo Log作用

实现事务的原子性
Undo Log 是为了实现事务的原子性而出现的产物。事务处理过程中,如果出现了错误或者用户执行了 ROLLBACK 语句,MySQL 可以利用 Undo Log 中的备份将数据恢复到事务开始之前的状态。

实现多版本并发控制(MVCC)
Undo Log 在 MySQL InnoDB 存储引擎中用来实现多版本并发控制。事务未提交之前,Undo Log保存了未提交之前的版本数据,Undo Log 中的数据可作为数据旧版本快照供其他并发事务进行快照读。

事务A手动开启事务,执行更新操作,首先会把更新命中的数据备份到 Undo Buffer中。
事务B手动开启事务,执行查询操作,会读取 Undo 日志数据返回,进行快照读

以上是关于纯手绘图解 - MySQL undo log、redo log、binlog的主要内容,如果未能解决你的问题,请参考以下文章

3000帧动画图解MySQL为什么需要binlogredo log和undo log

mysql的undo log和redo log

mysql的innodb引擎下的undo log中包括“写redo log”这件事?

MySQL Undo Log 撤销日志

说说MySQL中的Redo log Undo log都在干什么

刨析 MySQL 三大日志:binlogredo log 和 undo log