MySQL之Undo Log
MySQL之Undo Log
简介
Undo Log是InnoDB存储引擎生成的逻辑日志,实现了事务ACID特性中的原子性,主要作用于**事务回滚和MVCC**。
详细分析MySQL事务日志(redo log和undo log) - 骏马金龙 - 博客园 (cnblogs.com)
MySQL · 引擎特性 · 庖丁解InnoDB之UNDO LOG (taobao.org)
MySQL · 引擎特性 · InnoDB undo log 漫游 (taobao.org)
基本概念
在数据修改的时候,不仅记录了redo,还记录了相对应的undo,如果因为某些原因导致事务失败或回滚了,可以借助该undo进行回滚。
undo log和redo log记录物理日志不一样,它是逻辑日志。可以认为当delete一条记录时,undo log中会记录一条对应的insert记录,反之亦然,当update一条记录时,它记录一条对应相反的update记录。
当执行rollback时,就可以从undo log中的逻辑记录读取到相应的内容并进行回滚。有时候应用到行版本控制的时候,也是通过undo log来实现的:当读取的某一行被其他事务锁定时,它可以从undo log中分析出该行记录以前的数据是什么,从而提供该行版本信息,让用户实现快照读。
undo log是采用段(segment)的方式来记录的,每个undo操作在记录的时候占用一个undo log segment。
另外,**undo log也会产生redo log,因为undo log也要实现持久性保护。**
ps:select操作没有对数据行进行修改,不会生成Undo Log。
存储方式
undo log是采用段(segment)的方式来记录的,每个undo操作在记录的时候占用一个undo log segment。
一个rollback segment中有1024个undo log segment
版本 < 5.5: 只支持1个
rollback segment,这样就只能记录1024个undo log segment。版本 >= MySQL 5.5:可以支持128个
rollback segment,即支持128*1024个undo操作,还可以通过变量innodb_undo_logs(5.6版本以前该变量是innodb_rollback_segments)自定义多少个rollback segment,默认值为128。
存储位置:
默认存放在共享表空间中。
如果开启了
innodb_file_per_table,将放在每个表的.ibd文件中。
