undo log有两个作用:提供回滚和MVC
undo log主要记录了数据的逻辑变化,例如
当INSERT一条记录时,则undo log记录一条DELETE记录; 当UPDATE一条记录时,则undo log记录一条相反的 UPDATE记录;
当delete一条记录时,则undo log记录一条insert记录;
innodb中 undo log分为2种:
insert undo log :insert操作产生的undo log
update undo log :update 和 delete操作产生的 undo log
因为insert操作只对事务本身可见,因此insert undo log可以在提交事务后就删除;
在事务提交的时候,会将该事务对应的undo log放入到删除列表中,未来通过purge来删除
在数据修改的时候,不仅记录了redo log,还记录了相对应的undo log,如果因为某些原因导致事务失败或回滚了,可以借助该undo log进行回滚。
rollback segment
一个回滚段(rollback segment)中有1024个undo log segment
变量 innodb_undo_logs (5.6版本以前该变量是 innodb_rollback_segments )可以自定义多少个rollback segment,默认值为128。
在MySQL5.6中,undo log 的存放位置还可以通过变量 innodb_undo_directory 来自定义存放目录,默认值为"."表示datadir。
默认rollback segment全部写在一个文件中,但可以通过设置变量 innodb_undo_tablespaces 平均分配到多少个文件中。
该变量默认值为0,即全部写入一个表空间文件。
delete/update操作的内部机制
在事务提交的时候,会将该事务对应的undo log放入到删除列表中,未来通过purge线程来删除。
delete操作实际上不会直接删除,而是将delete对象打上delete flag,标记为删除,最终的删除操作是purge线程完成的。
update分为两种情况:update的列是否是主键列。
如果不是主键列,在undo log中直接反向记录是如何update的。
如果是主键列,update分两部执行:先删除该行,再插入一行目标行。
undo日志属于逻辑日志,redo是物理日志。