MySQL系列P6—undolog简介

238 阅读2分钟

  本文已参与「新人创作礼」活动, 一起开启掘金创作之路。

前言

  今天来了解一下MySQL中的undolog

undolog

  undolog主要用来记录某条行记录被修改之前的状态,记录的是修改前的数据,这样的话,当事务进行回滚时,就可以通过undolog记录恢复到事务开始前的样子。事务的原子性和持久性也是依靠undolog来实现的

  undo log主要记录了数据的逻辑变化,

  • 一条INSERT语句,undolog就会生成对应一条DELETE语句;

  • UPDATE语句,undolog就会生成与之相反逻辑的一条语句,这样在发生错误时,就能回滚到事务之前的数据状态

  • 在进行数据恢复的时候,与binlogredolog结合使用,保证了数据恢复的正确性

  undolog的大致流程如下:

  • 在事务开始之前将修改前的版本写入到undolog 中;
  • 开始进行修改,将修改过的数据保存到内存当中;
  • undolog持久化到磁盘当中;
  • 将数据页刷回到磁盘当中;
  • 事务提交;

  这里举个具体的例子:

image.png

  需要注意的是,与redolog一样,undolog也是要先于数据页刷回到磁盘当中。在恢复数据时,如果undolog是完整的,就可以根据undolog来回滚事务。

与redolog的合作

  在一个事务当中,可能会对同一条数据进行多次修改,如果每次修改都将之前的数据记录到undolog中,就会导致undolog日志量太大,于是redolog华丽登场。

  在一个事务当中,如果是对同一条记录进行修改,undolog只会记录事务开始前的原始记录,当再次对这条记录进行修改时,redolog会记录后续的变化。在数据恢复时,redolog完成前滚undolog完成回滚,二者相互协调完成数据的恢复。过程如下所示:

image.png

其他作用

  还有一个功能就是MVCC多版本控制链了,这个请参考这篇文章,MySQL系列P2—MVCC多版本控制链

总结

image.png

Reference

详细分析MySQL事务日志

MySQL之binlog日志、undo日志、redo日志

必须了解的mysql三大日志-binlog、redo log和undo log

MySQL的undo,redo,二阶段提交思维导图

MySQL三大日志