1.前言:
undo 是一个很模糊的概念,往往它在Mysql中是一个玄之又玄的东西,因为我们很少能深入地去了解它。
2.undo到底是个什么?
众所周知,我们在面试的时候往往会被问到MVCC机制(该机制后续一节会细讲),有不少小伙伴不太容易回答出来,或者说不全面,因为这里面涉及了小的知识点,比如说锁,比如说undo等等。
通过上一节,知道了重做日志记录了事务的行为,可以很好的对页进行'重做'操作,但是有时候事务可能需要回滚,这时就需要undo.因此在对数据库进行修改时,innodb存储引擎不但会产生redo,还是产生undo. 需要undo的场景是当用户执行事务或语句用于某种原因失败了,又或者用户执行了一条rollback语句请求回滚,就可以利用这些undo信息将数据回滚到修改之前的样子。
undo的结构这里暂时不细讲,会在innodb存储引擎一节会说的,这里就将要说一下它是一个特殊的段(segment),位于共享表空间内,当然在5.7版本的时候,它就可以从共享表空间中独立出来了,控制参数会在末尾写出。
undo是一个逻辑日志,所以它只是将数据库逻辑地恢复到原来的样子,所有的修改都被逻辑地取消了,但是数据结构和页本身在回滚之后可能大不相同。
当执行一个事务的时候,这个事务会被分配一个新的段,即表空间会增大,当用户执行rollback时,会将插入的事务进行回滚,但是表空间的大小并不会因此而收缩,因此,简而言之,当innodb存储引擎回滚时,它实际做的是与先前相反的工作, 例如:insert -->delete delete-->insert update-->update
除了回滚功能,undo 的另外一个作用就是MVCC,即在innodb存储引擎中MVCC的实现是通过undo来完成,当用户读取一行记录时,若该记录已经被其他事务占用,当前事务可以undo 读取之前的行版本信息,以此实现非锁定读
最后最重要的一点是,undo log 会产生redo log ,也就是undo log 的产生会伴随着redo log的产生,这时应该undo log 也需要持久性保护。
3.undo参数配置
innodb_undo_directory ##设置undo 日志文件所在的目录,默认在数据目录下
inodb_undo_logs ##用来设置rollback segment个数,默认128
innodb_undo_tablespaces ##用来设置undo 文件的数量