mysql commit undo_mysql原理~undo

mysql undo详谈

1 简介:undo是MVCC机制的基础部分之一

2 作用:为了实现可重复性读,存储历史数据

3 存储:5.6以前undo都存储在内存和ibdata1中,5.6以后undo可以独立成单独的文件,更可以进行truncate表空间,减少磁盘容量

5 回滚段三阶段

0 回滚段分类

update_undo: 只用于事务内的update语句  这里会加入到其对应rollback segment的history list数据页列表上,history list长度加1

insert_undo:只用于事务内的insert语句 新插入的记录产生的Undo不会被任何查询语句所引用,因此可以直接释放undo,这里的undo log不会累加到history list上

1 事务开始后,针对读写事务,会预先在内存中分配一个回滚段

2 事务进行中,将历史数据写入undo page中

1 事务commit

2 事务rollback

1:对于标记删除的记录清理标记删除标记;

2:对于in-place更新,将数据回滚到最老版本;

3:对于插入操作,直接删除聚集索引和二级索引记录(row_undo_ins)。

6 purge清理undo段

1 清理事务提交后不需要的undo信息 从回滚段的HISTORY 文件链表上开始遍历释放Undo log segment,由于history 链表是按照trx no有序的,因此遍历truncate直到完全清除,或者遇到一个还未purge的undo log(trx no比当前purge到的位置更大)时才停止。

2 清理已经被打上delete标记的数据实现物理删除

相关参数变量 innodb_purge_threads=1(默认值)

7 相关 innodb status信息

Purge done for trx's n:o < 219761368 undo n:o < 0 state: running but idle

History list length 3228

purge done 代表已经完成的事务量

n:0< 代表正在执行的purge

state:代表线程是否繁忙

history-list-length  代表存在的undo个数 16KX3228 代表使用的undo大小 一页是16K

这里要注意 一般情况下history-list不可能为零,因为 update_undo有一部分会进行cache重用,而这部分也算在没有清理的列表之中

8 关于ibdata1暴涨的原因

1 共享表空间=>改用独立表空间

2 大量undo暴涨了ibdata的空间

1 存在未完成的事务,可以通过hsitory list观察计算

2 执行过大事务(一般都是这种原因造成的)

9 补充

当我们delete数据行时,是对数据页中要删除的数据行做标记“deleted”,事务提交(速度快);

10 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个回滚段

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL事务的两阶段提交(Two-Phase Commit,2PC)是一种用于保证分布式数据库事务的一致性的协议。它包括两个阶段:准备阶段和提交(或中止)阶段。 在准备阶段,协调者(通常是事务的发起者)会向所有参与者发送准备请求,并等待它们的响应。每个参与者会执行事务操作,并将操作结果写入redo log和undo log中。 redo log是MySQL中的一种日志,用于记录事务执行过程中所做的修改操作。它记录了在事务执行期间对数据库所做的修改,包括插入、更新和删除操作。redo log的目的是在数据库发生崩溃等异常情况时,可以通过重放redo log来恢复数据的一致性。 undo log也是MySQL中的一种日志,用于记录事务执行过程中所做的回滚操作。当事务需要回滚时,可以根据undo log中的信息将数据还原到事务开始之前的状态。 在准备阶段结束后,如果所有参与者都成功地执行了操作并准备好提交事务,协调者会发送提交请求。参与者收到提交请求后会将事务进行提交,并将提交结果反馈给协调者。如果有任何一个参与者无法执行操作或者出现错误,协调者会发送中止请求,参与者则会回滚事务。 通过两阶段提交协议,可以确保在分布式环境下的多个节点执行事务时,要么所有节点都成功地提交事务,要么都进行回滚,从而保证了数据的一致性。同时,redo log和undo log的使用可以提供数据的持久性和恢复能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值