undo log、rollback segment

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是物理日志。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值