本文已参与「新人创作礼」活动, 一起开启掘金创作之路。
前言
今天来了解一下MySQL中的undolog。
undolog
undolog主要用来记录某条行记录被修改之前的状态,记录的是修改前的数据,这样的话,当事务进行回滚时,就可以通过undolog将记录恢复到事务开始前的样子。事务的原子性和持久性也是依靠undolog来实现的。
undo log主要记录了数据的逻辑变化,
-
一条
INSERT语句,undolog就会生成对应一条DELETE语句; -
UPDATE语句,undolog就会生成与之相反逻辑的一条语句,这样在发生错误时,就能回滚到事务之前的数据状态 -
在进行数据恢复的时候,与
binlog,redolog结合使用,保证了数据恢复的正确性
undolog的大致流程如下:
- 在事务开始之前将修改前的版本写入到
undolog中; - 开始进行修改,将修改过的数据保存到内存当中;
- 将
undolog持久化到磁盘当中; - 将数据页刷回到磁盘当中;
- 事务提交;
这里举个具体的例子:
需要注意的是,与redolog一样,undolog也是要先于数据页刷回到磁盘当中。在恢复数据时,如果undolog是完整的,就可以根据undolog来回滚事务。
与redolog的合作
在一个事务当中,可能会对同一条数据进行多次修改,如果每次修改都将之前的数据记录到undolog中,就会导致undolog日志量太大,于是redolog华丽登场。
在一个事务当中,如果是对同一条记录进行修改,undolog只会记录事务开始前的原始记录,当再次对这条记录进行修改时,redolog会记录后续的变化。在数据恢复时,redolog完成前滚,undolog完成回滚,二者相互协调完成数据的恢复。过程如下所示:
其他作用
还有一个功能就是MVCC多版本控制链了,这个请参考这篇文章,MySQL系列P2—MVCC多版本控制链。