用来应对事务回滚的场景。
比如一个事务里有4个增删改操作,结果目前为止已经执行了2个增删改SQL了,已经更新了一些buffer pool里的数据了,但是还有2个增删改SQL的逻辑还没执行, 这个时候就很尴尬了,如果你要回滚事务的话,那么必须要把已经在buffer pool的缓存页里执行的增删 改操作给回滚了 。 但是怎么回滚呢?毕竟无论是插入,还是更新,还是删除,该做的都已经做了啊! 所以在执行事务的时候,才必须引入另外一种日志,就是undo log回滚日志
回滚日志记录的东西很简单,比如你要是在缓存页里执行了一个insert语句,那么此时 你在undo log日志里,对这个操作记录的回滚日志就必须是有一个主键和一个对应的delete操作,要能 让你把这次insert操作给回退了。
-其实就是 你这次操作的复原语句。你删他新增,你新增他删除。 所以Select 不需要undo log。
事务执行期间,除了写redo log 日志还必须要写undo log 日志,这个是来确保事务回滚操作的。
各种类型的undo log 长什么样?
INSERT语句的undo log的类型是TRX_UNDO_INSERT_REC
- 这条日志的开始位置
- 主键的各列长度和值
即使你没有设置主键,MySQL自己也会给你弄一个row_id作为隐藏字段,做你的主键
- 表id
- undo log日志编号
每个undo log 日志都有自己的编号,一个事务里有多个SQL,就会有多个undo log,每个事务里的undo log 日志都是从0开始的,然后依次递增。
- undo log日志类型
- 这条日志的结束位置

回滚:假设在buffer Pool 的一个缓存页插入一条数据,写了一条undo log ,现在事务要回滚,就直接把这条insert 语句的undo log 拿出来,就知道在哪个表里插入的数据,主键是什么,直接定位到那个表和主键对应的缓存页,从里面删除掉之前insert 插入的数据就可以实现回滚效果。
