加入收藏 | 设为首页 | 会员中心 | 我要投稿 广州站长网 (https://www.020zz.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

Mysql基于两阶段实现redo、binlog日志一致性

发布时间:2022-12-04 01:03:48 所属栏目:MySql教程 来源:互联网
导读: MySQL 的执行器使用两阶段提交主要解决 binlog 和 redo log 的数据一致性的问题。

redo log 和 binlog 都可以用于表示事务的提交状态,而两阶段提交就是让这两个状态保持逻辑上的一致。下

MySQL 的执行器使用两阶段提交主要解决 binlog 和 redo log 的数据一致性的问题。

持久避孕套能不能持久_mysql持久化_姜承尧mysql技术内幕sql编程^^^mysql内核i

redo log 和 binlog 都可以用于表示事务的提交状态,而两阶段提交就是让这两个状态保持逻辑上的一致。下图为 MySQL 二阶段提交简图:

mysql持久化_姜承尧mysql技术内幕sql编程^^^mysql内核i_持久避孕套能不能持久

两阶段提交原理描述:

InnoDB redo log 写盘,InnoDB 事务进入 prepare 状态。如果前面 prepare 成功,binlog 写盘,那么再继续将事务日志持久化到 binlog,如果持久化成功,那么 InnoDB 事务则进入 commit 状态(在 redo log 里面写一个 commit 记录)

备注: 每个事务 binlog 的末尾,会记录一个 XID event,标志着事务是否提交成功,也就是说,recovery 过程中,binlog 最后一个 XID event 之后的内容都应该被 purge。

2PC即Innodb对于事务的两阶段提交机制。当MySQL开启binlog的时候,会存在一个内部XA的问题:事务在存储引擎层(redo)commit的顺序和在binlog中提交的顺序不一致的问题。如果不使用两阶段提交,那么数据库的状态有可能用它的日志恢复出来的库的状态不一致。

事务的commit分为prepare和commit两个阶段:(注意InnoDB作为RM)

1、prepare阶段:redo持久化到磁盘(redo group commit)mysql持久化,并将回滚段置为prepared状态,此时binlog不做操作。

mysql持久化_姜承尧mysql技术内幕sql编程^^^mysql内核i_持久避孕套能不能持久

2、commit阶段:innodb释放锁,释放回滚段,设置提交状态,binlog持久化到磁盘,然后存储引擎层提交。

持久避孕套能不能持久_mysql持久化_姜承尧mysql技术内幕sql编程^^^mysql内核i

(编辑:广州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!