回滚机制_详解mysqlundo管理--概念、三阶段、purge机制、
undo构成和布局
概述
之前已经介绍了⼀次MYSQL UNDO⽅⾯的内容,今天主要再介绍⼀下UNDO的其他⼏个⽅⾯,下⾯先简单说下概念。
⼀、undo概述
undo log有两个作⽤:提供回滚和多个⾏版本控制(MVCC)。
在数据修改的时候,不仅记录了redo,还记录了相对应的undo,如果因为某些原因导致事务失败或回滚了,可以借助该undo进⾏回滚。
5.6以前undo都存储在内存和ibdata1中,5.6以后undo可以独⽴成单独的⽂件,更可以进⾏truncate表空间,减少磁盘容量
⼆、undo三阶段
1、回滚段分类
update_undo: 只⽤于事务内的update和delete语句 这⾥会加⼊到其对应rollback segment的history list数据页列表上,history list长度加1。该log需要提供mvcc机制,因此不能在事务提交时就进⾏删除。提交时放⼊undo log链表,等待purge线程进⾏清除。
insert_undo:只⽤于事务内的insert语句 新插⼊的记录产⽣的Undo不会被任何查询语句所引⽤,因此可以直接释放undo,这⾥的undo log不会累加到history list上。这⾥的insert操作的记录只对事务本⾝可见。所以该undo log在事务提交后直接删除,不需要进⾏purge操作。
2、事务开始后,针对读写事务,会预先在内存中分配⼀个回滚段
3、事务进⾏中,将历史数据写⼊undo page中
1)事务commit
2)事务rollback
对于标记删除的记录清理标记删除标记;
对于in-place更新,将数据回滚到最⽼版本;
对于插⼊操作,直接删除聚集索引和⼆级索引记录(row_undo_ins)
三、purge机制
purge⽤来最终完成delete和update操作。
全局动态参数innodb_purge_batch_size⽤来设置每次purge操作需要清理的undo page数量。默认值为300
全局动态参数innodb_max_purge_lag⽤来控制history list的长度,若⼤于该参数时,其会延缓DML的操作
全局动态参数innodb_max_purge_lag_delay,⽤来控制DML操作每⾏数据的最⼤延缓时间,单位为毫秒。
1、清理事务提交后不需要的undo信息 从回滚段的HISTORY ⽂件链表上开始遍历释放Undo log segment,由于history 链表是按照trx no有序的,因此遍历truncate直到完全清除,或者遇到⼀个还未purge的undo log(trx no⽐当前purge到的位置更⼤)时才停⽌。
2、清理已经被打上delete标记的数据实现物理删除
3、相关参数变量 innodb_purge_threads=1(默认值)
四、相关 innodb status信息
show engine innodb status G;
Purge done for trx's n:o < 2463087 undo n:o < 0 state: running but idleHistory list length 26
说明:
purge done 代表已经完成的事务量
n:0< 代表正在执⾏的purge
state:代表线程是否繁忙
history-list-length 代表存在的undo个数 16KX3228 代表使⽤的undo⼤⼩ ⼀页是16K
这⾥要注意 ⼀般情况下history-list不可能为零,因为 update_undo有⼀部分会进⾏cache重⽤,⽽这部分也算在没有清理的列表之中五、undo的构成和布局
1、由128个回滚段构成,32个回滚段⽤于系统的临时表空间,96个回滚段⽤于事务
2、每个回滚段维护了⼀个段头页,在该page中⼜划分了1024个slot,每个slot⼜对应到⼀个undo log对象,因此理论上InnoDB最多⽀持 96 * 1024个普通事务。
3、独⽴表空间的space id都是从1 开始,0被预留在ibdata中.space id必须是连续分配的,不能断档
4、8.0之前的版本默认只能创建128个回滚段
六、查看undo信息
1.查看rollback segment所在页
select segment_id,space,page_no from information_schema.innodb_trx_rollback_segment;
2.记录事务对应的undo log信息
mysql中delete语句select * from information_schema.INNODB_TRX_UNDOG;
七、各版本UNDO说明
1、5.5
undo位置:默认ibdata1中,不⽀持独⽴表空间
缺点:⼤事务可能造成ibdata1暴涨,只能dump导出导⼊或者从新搭建
参数:rollback_segment(默认128个回滚段)
2、5.6
undo位置:默认ibdata1中,⽀持独⽴表空间
参数:
innodb_undo_logs(代替5.5的名字,默认128个回滚段)innodb_undo_directory 设置undo位置,默认当前⽂件夹innodb_undo_tablespaces 默认关闭,开启需要设置为1
缺点:mysql5.6只⽀持初始化设置独⽴表空间,不可中途开启.⽽且也不能解决回收undo表空间问题.但是可以⽀持分布在不同磁盘,⽤来提⾼
IO能⼒
建议:不建议5.6开启独⽴undo空间,没什么意义
3、5.7
undo位置:默认ibdata1中,⽀持独⽴表空间
参数:
innodb_max_undo_log_size=1073741824innodb_undo_directory=./ 独⽴undo表空间路径innodb_undo_log_truncate=OFF ⽀持truncate回收表空间,默认关闭innod 注意点:
1)mysql5.7同样是只⽀持初始化设置,不可中途开启
2)truncate会进⾏清理undo⽂件的条件: 1 触发 max_undo_log阈值(undo tablespace超过1GB(参数innodb_max_undo_log_size来控
制))
3)存在⾄少⼀个可⽤的undo⽂件
4)被清理对象皆为free,也即为事务不需要
以上三点都达到时候才会触发truncate进⾏undo表空间收缩,由purge线程执⾏
5)尽量避免⼤事务,将⼤事务进⾏拆分
4、8.0的持续改进:
1)默认开启独⽴undo表空间,更改undo表空间命名⽅式,默认⼤⼩为10M
2)在8.0之前只能创建128个回滚段,⽽在8.0版本开始,每个Undo tablespace可以创建128个回滚段,也就是说,总共有
innodb_rollback_segments * innodb_undo_tablespaces个回滚段。这个改变的好处是在⾼并发下可以显著的减少因为分配到同⼀个回
滚段内的事务间产⽣的锁冲突
3)Innodb_undo_truncate参数默认打开,会⾃动进⾏删除
4)⽀持undo tablespace加密
5)在8.0中直接在内存中为其创建单独的内存结构,这32个slot可以⽤于持久化的undo回滚段
6)允许动态的增加undo tablespace的个数,也就是说可以动态调整innodb_undo_tablespaces。当调⼤该参数时,会去创建新的undo tablespace。但如果设⼩该值,则仅仅是不实⽤多出来的Undo tablespace,⽬前不会去主动删除它们
后⾯会分享更多devops和DBA⽅⾯的内容,感兴趣的朋友可以关注下~
如果你觉得这篇⽂章对你有帮助, 请⼩⼩打赏下~
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论