暂无图片
redolog有prepare,commit2个过程,binlog有没有?
我来答
分享
暂无图片 匿名用户
redolog有prepare,commit2个过程,binlog有没有?

redolog prepare——binlog——redolog commit

这个2阶段提交中,redo 是2个过程


源码中有也有binlog的prepare和commit,好像,怎么理解?

COMMIT_SQL
>trans_commit
>ha_commit_trans
>tc_log->prepare(这里是MYSQL_BINLOG::prepare)
>ha_prepare_low
>binlog_prepare(啥也不干)
>innobase_xa_prepare
>tc_log->commit(MYSQL_BINLOG::commit)
>process_flush_stage_queue(ha_flush_logs)(刷redo)
>flush_cache_to_file(刷binlog)
>sync_binlog_file
>process_commit_stage_queue

我来答
添加附件
收藏
分享
问题补充
1条回答
默认
最新
龙镇君

MySQL(特别是InnoDB存储引擎和二进制日志binlog),事务的提交过程通常涉及多个阶段和组件的协调,以确保数据的一致性和可靠性。你提到的“redolog prepare——binlog prepare——redolog commit”以及MySQL源码中的binlog相关操作,是这种复杂提交过程的一部分。下面我会尝试详细解释这个过程:

1. Redo Log Prepare

在InnoDB存储引擎中,Redo Log是用来记录数据修改操作的日志,它确保了即使在系统崩溃的情况下,已提交的事务对数据的修改也不会丢失。在事务开始修改数据时,这些修改会先被记录到Redo Log的缓冲区中,这个过程被称为“Redo Log Prepare”。这确保了即使数据还没有被写入到磁盘上的数据文件中,修改也不会丢失。

2. Binlog Prepare

MySQL的二进制日志(Binary Log,简称Binlog)是MySQL的复制和数据恢复的一个重要组件。它记录了所有的DDL(数据定义语言)和DML(数据操纵语言)语句(除了数据查询语句),并且以二进制形式存储。在事务准备提交之前,Binlog会记录这个事务将要执行的所有SQL语句(或这些语句对数据库状态的影响),这个过程称为“Binlog Prepare”。这确保了复制过程中,从库能够接收到与主库相同的数据变更。

3. Redo Log Commit

当事务准备提交时,InnoDB存储引擎会首先将Redo Log缓冲区中的日志条目刷新(flush)到磁盘上的Redo Log文件中,这个过程称为“Redo Log Commit”。这一步确保了即使数据库系统发生崩溃,已提交事务的修改也不会丢失,因为Redo Log已经包含了恢复这些修改所需的所有信息。

4. Binlog Commit

紧接着,MySQL会将Binlog中的事务日志条目也刷新到磁盘上的Binlog文件中,这个过程称为“Binlog Commit”。这确保了即使在Binlog写入过程中发生系统崩溃,复制过程也能从最近的Binlog记录点开始恢复,从而保证了数据的一致性和复制的准确性。

源码中的流程

在你给出的源码流程中:

  • tc_log->prepare(这里是MYSQL_BINLOG::prepare) 对应于Binlog的Prepare阶段。
  • tc_log->commit(MYSQL_BINLOG::commit) 对应于Binlog的Commit阶段。
  • process_flush_stage_queue(ha_flush_logs) 和 flush_cache_to_file(刷redo) 可能是与Redo Log的刷新相关的操作,尽管它们没有明确标出为Redo Log的Commit,但它们确保了Redo Log被写入磁盘。
  • sync_binlog_file 确保Binlog文件也被安全地写入磁盘。
  • COMMIT_SQL、trans_commit、ha_commit_trans等函数调用tc_log->prepare和tc_log->commit来实现上述的两阶段提交逻辑。这些函数确保了事务的原子性和持久性,同时也支持了主从复制的一致性要求

整个过程确保了数据的一致性和复制的准确性,即使在系统崩溃的情况下也能恢复。这种两阶段提交(2PC,Two-Phase Commit)机制是数据库事务管理中的一个关键概念。

暂无图片 评论
暂无图片 有用 0
打赏 0
回答交流
Markdown


请输入正文
提交
相关推荐
mysql 只有2个值的varchar10字段,是直接用varchar好,还是另外建一个表关联比较好?
回答 3
路过学习了。每天进步一点点,每天学习一点点
SHOW VARIABLES; mysql的这些变量怎么导出到本地?
回答 2
xshell开启启动日志,就会在本地生成一个日志文件执行命令以及结果就会保存在上面
MySQL一个实例中有很多数据库,这个数据库怎么和业务关联上?
回答 2
互联网大厂的规范是一个service一个db,一个db一个业务账号,service之间不允许直接跨库访问,可以采用rpc接口调用。
MySQL 的递归查询是什么?
回答 1
在MySQL中,递归查询(RecursiveQuery)是一种查询技术,它允许在单个查询中使用递归方式进行数据检索。这种查询技术对于处理层次结构或具有递归关系的数据非常有用,例如组织结构、树形结构或图
MySQL数据库创建成功了,但是不在窗口显示怎么办?
回答 1
已采纳
左边刷新一下。或用命令直接USE 
performance_schema.setup_instruments set enabled = 'yes' ,需要重启实例吗?怎么更新不生效
回答 1
你试下不就知道了么.建议修改参数文件performanceschemainstrument'memory/%COUNTED'
mysql5.7可以给某个用户建库的权限么?
回答 1
已采纳
create的权限。应该可以
MYSQL 最后 ORDER BY sort , SORT 不是字段, 也不是 AS 匿名字段. SORT有什么作用?
回答 3
selectid,name,btntype,permissionfromsysresourceswherebtntypein(0,1,2)andresourcetype1orderbysortMYSQ
在mysql5.7版本中,重命名数据库的方法通常有几种?
回答 5
已采纳
1.RENAMEDATABASEdbnameTOnewdbname2.如果所有表都是MyISAM类型的话,可以改文件夹的名字3.重命名所有的表4.mysqldump导出数据再导入5.使用Shell脚本
MySQL 外键约束不兼容是什么问题?
回答 1
没理解问题。不过一般来说数据库都不建议使用外键。不管什么数据库。