首页 > 其他分享 >两阶段提交中的 redo log 和 binlog 关系

两阶段提交中的 redo log 和 binlog 关系

时间:2024-09-25 22:01:48浏览次数:1  
标签:binlog 事务 log 写入 MySQL redo

 

MySQL 的 InnoDB 存储引擎使用 两阶段提交 来协调 redo log 和 binlog 的写入顺序,确保事务的一致性。具体过程如下:

  1. 准备阶段(Prepare Phase)

    • InnoDB 将事务修改写入 redo log,但此时 redo log 处于 prepare 状态,表示事务的修改已经写入磁盘,但是还没有提交。
    • 同时,MySQL 将事务的 binlog 写入 binlog buffer 中(还未刷到磁盘)。
  2. 提交阶段(Commit Phase)

    • 首先,MySQL 将 binlog buffer 中的内容刷入磁盘,写入 binlog 中。
    • 然后,InnoDB 将 redo log 从 prepare 状态切换为 commit 状态,标志事务最终提交完成。

这个过程确保了 binlog 和 redo log 的一致性。因为 binlog 用于主从复制、数据恢复等功能,所以需要确保事务在 binlog 中成功记录后,才能最终提交。

崩溃恢复时的决策机制

当 MySQL 服务器崩溃或断电时,事务可能正处于两阶段提交的中间状态,即 redo log 可能已经处于 prepare状态,但 binlog 还没有写入完成。此时,MySQL 会在恢复时根据以下原则来决定该事务是提交还是回滚:

  1. 如果找到对应的 binlog

    • MySQL 会检查 binlog 中是否有与 redo log 中相同的 XID(事务 ID)。
    • 如果找到了相同的 XID,说明事务的 binlog 已经写入成功,事务可以安全地提交。因此,MySQL 会将 redo log 从 prepare 状态变为 commit 状态,并提交该事务。
  2. 如果未找到对应的 binlog

    • 如果 binlog 中没有找到与 redo log 相同的 XID,则说明事务的 binlog 还未写入成功,这时 MySQL 会选择回滚该事务。MySQL 将删除 prepare 状态的 redo log 并回滚事务。

这个机制确保了 MySQL 在崩溃恢复时能够根据事务日志的状态做出正确的决策,保持数据一致性。

为什么要检查 binlog?

  • binlog 是 MySQL 中的逻辑日志,主要用于主从复制和数据恢复。如果 binlog 没有成功写入磁盘,可能会导致主从数据不一致。
  • redo log 则是 InnoDB 的物理日志,用于崩溃恢复,记录了事务的物理更改。
  • 通过将 redo log 和 binlog 结合使用,MySQL 能够在崩溃时恢复数据,同时保证数据复制的正确性。

标签:binlog,事务,log,写入,MySQL,redo
From: https://www.cnblogs.com/towboa/p/18432322

相关文章

  • FPGA Verilog基本语句(语法)FPGA入门
    本篇文章主要写了在Verilog环境下,FPGA基本语法和数据类型。可以通过导航键快速进入assign语句、always语句等其他内容!对于Verilog(FPGA):module     ...                   ==》构成主体endmodulemodule模块名(【端口......
  • ELK+zookeeper+kafka+rsyslog集群搭建
    前言环境困境:1.开发人员无法登陆服务器2.各系统都有日志,日志数据分散难以查找3.日志数据量大,查询忙,不能实时环境要求:1.日志需要标准化 集群流程图: 角色: 软件:以上软件都可以从官网下载:https://www.elastic.co/download......
  • 国庆节到了,扣子智能体coze画板功能实现贺卡编辑智能体自动添加logo和二维码,让海报品牌
    大家好,我是Shelly,一个专注于输出AI工具和科技前沿内容的AI应用教练,体验过300+款以上的AI应用工具。关注科技及大模型领域对社会的影响10年+。关注我一起驾驭AI工具,拥抱AI时代的到来。自媒体时代,不管是一个人、一个团队还是一家公司,都是一个IP。那么添加品牌的标志就是必不可少......
  • Logfire:Python 可观测性的强大工具
    Logfire是Pydantic团队推出的可观测性平台,为Python应用提供了深度洞察。它不仅仅是一个日志记录工具,更是一个全面的可观测性解决方案。Logfire的仪表板功能强大,提供了多个预构建的仪表板作为起点,如Web服务仪表板和系统衡量指标仪表板。Web服务仪表板可以显示请求总......
  • centos(linux):用命令设置用户的shell以及/bin/false和/sbin/nologin的区别
    一,/bin/false和/sbin/nologin作为shell时的区别1,/bin/false/bin/false是一个什么都不做,立即返回非零退出状态的命令。它通常用于禁止用户登录用户不会收到任何错误或提示信息,登录尝试简单地被拒绝,没有任何解释2,/sbin/nologin/sbin/nologin是一个专门设计来阻止用户登录的程......
  • 【高中数学/对数/比大小】a=log(11,13) vs b=log(41,47)
    【问题】请比较两数a=log(11,13)与b=log(41,47)的大小。【解答】a=log(11,13)=log(11^3,13^3)=log(1331,2191)b=log(41,47)=log(41^2,47^2)=log(1681,2209)因为真数2191很接近2209而底数1331明显小于1681故指数a必大于bEND......
  • INFT 2064 Web Technologies
    INFT2064WebTechnologiesAssignment1SAExpiationDataAllworkistobedoneindividuallyandmustbeyourownwork.YoumustnotuseAItools,discussorshareyour@razorcodeorLINQ/LambdaC#,JavaScriptcodewithanyoneelse. Youmustonlysubmit......
  • 【高中数学/对数/比大小】a=log_5_7 vs b=log_11_14
    【问题】比较a=log_5_7,b=log_11_14两数的大小?【解答】a-b=ln7/ln5-ln14/ln11=(ln7*ln11-ln5*ln14)/ln5/ln11=(ln7*ln11-ln5*ln7-ln5*ln2)/ln5/ln11=(ln7*ln2.2-ln5*ln2)/ln5/ln11>0所以a>b即log_5_7>log_11_14END......
  • Serilog文档翻译系列(五) - 编写日志事件
    日志事件通过Log静态类或ILogger接口上的方法写入接收器。下面的示例将使用Log以便语法简洁,但下面显示的方法同样可用于接口。Log.Warning("Diskquota{Quota}MBexceededby{User}",quota,user);通过此日志方法创建的警告事件将具有两个相关属性,Quota和User。假......
  • 大数据-136 - ClickHouse 集群 表引擎详解1 - 日志、Log、Memory、Merge
    点一下关注吧!!!非常感谢!!持续更新!!!目前已经更新到了:Hadoop(已更完)HDFS(已更完)MapReduce(已更完)Hive(已更完)Flume(已更完)Sqoop(已更完)Zookeeper(已更完)HBase(已更完)Redis(已更完)Kafka(已更完)Spark(已更完)Flink(已更完)ClickHouse(正在更新···)章节内容上节我们完成了如下的内容:测试连接集群数据类型......