代码编织梦想

1,前言

MySQL 通过两阶段提交的机制,保证了 redo log 和 bin log 的逻辑一致性,进而保证了数据的不丢失以及主从库的数据一致。

而说起两阶段提交,就不得不先介绍一下 redo log 和 bin log。

2,redo log

redo log 即重做日志,是 InnoDB 引擎特有的一种日志(有的面试官经常问到这一点)。

redo log 主要做什么呢?

以更新数据为例,我们知道,MySQL 的数据是存储在磁盘上的,如果每一次更新数据,都去磁盘寻址找到要更新的数据,进行更新操作的话,这个 IO 成本是非常高的。

如果是固态硬盘还好,如果是机械硬盘,那么 MySQL 的更新性能根本无法满足我们的业务需要。

所以,MySQL 采用了一种叫做 WAL 的技术,Write-Ahead Logging。

当更新数据时,将更新操作(即某个数据页上做了什么修改)先写到 redo log 里面,然后更新内存,这个更新操作就算完成了。MySQL 会在服务器空闲的时候,把 redo log 的操作记录刷新到磁盘里,以保持数据的一致性。

需要注意的是,redo log 虽然也是磁盘上的一个文件,但是由于操作是顺序写,所以性能是非常高的。

当然了,redo log 也是有大小上限的,不可能无限制的写入。

以上图为例,配置了 4 个 redo log,write pos 就是代表当前记录写到什么位置了,而 check point 表示一个推进点,它会不断的前移,做擦除数据的操作,以保证 redo log 可以不断的写入。

当然,擦除数据之前,会把 redo log 的记录刷新到磁盘。

通过 redo log,可以保证即使 MySQL 发生异常重启,数据也不会丢失(因为 redo log 是物理日志,可以进行重放),这个特性就叫做 crash-safe。

3,bin log

bin log 是 MySQL Server 提供的一种日志,叫做归档日志,所有引擎都可以使用 bin log。

那 bin log 和 redo log 的区别是什么呢?

1,这两种日志的提供者不同:bin log 是由 MySQL Server 提供的,redo log 是 InnoDB 引擎特有的。

2,redo log 主要记录的是某个数据页做了什么修改,bin log 记录的是语句的原始逻辑,比如更新了某一行的某个字段。

3,redo log 是循环写的,数据会被覆盖。bin log 是追加写,一个文件写满,就写下一个文件。

4,两阶段提交

介绍完了 redo log 和 bin log,我们再看一下他们两者是如何配合完成两阶段提交的。

上图就是一个更新数据的流程,可以看到,在更新一条数据之前,MySQL 会先将数据加载到内存,然后更新内存,开始写 redo log。

此时,redo log 处于 prepare 状态,等到 bin log 写完之后,再提交事务,这一条记录的更新操作就算完成了。

redo log prepare -> 写 bin log -> redo log commit,这个流程就叫做两阶段提交。

下面我们分析一下,采用两阶段提交的好处。

情景一,redo log 处于 prepare 状态时,如果写 bin log 失败了,那么更新失败,此时 redo log 没有 commit,bin log 也没有记录,两者的状态是一致的,没有问题。

情景二,redo log 处于 prepare 状态时,写 bin log 成功,但是宕机导致 commit 失败了。此时 bin log 产生了记录,redo log 没有写入成功,数据暂时不一致。

但是不用担心,当 MySQL 重启时,会检查 redo log 中处于 prepare 状态的记录。在 redo log 中,记录了一个叫做 XID 的字段,这个字段在 bin log 中也有记录,MySQL 会通过这个 XID,如果在 bin log 中找到了,那么就 commit 这个 redo log,如果没有找到,说明 bin log 其实没有写成功,就放弃提交。

通过这样的机制,保证了 redo log 和 bin log 的一致性。

5,总结

之所以 MySQL 中既存在 redo log,又存在 bin log,这是因为 bin log 是 MySQL Server 提供的一种归档日志,其本身并不具备 crash-safe 能力。而 redo log 本身不具备归档能力,他是一种循环写的日志。

MySQL 通过将这两种日志整合起来,并通过两阶段提交的机制,保证了数据的一致性。

写文不易,感谢您的点赞和关注。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Park33/article/details/129671267

面试官:为什么mysql innodb是两段式提交?_weixin_33709609的博客-爱代码爱编程

Mysql的日志模块尤为重要,平日的crash-safe和主从都依赖我们的日志模块。 Mysql innoDB日志 Mysql innoDB有两个日志模块:redolog 和 binlog 咱们先看一下redolog。 redolog中文来讲就是重做日志,它有什么用呢?如果每次你的更新或者插入都写入磁盘的话那这个IO成本就比较大了,所以

全网最牛X的!!! MySQL两阶段提交串讲-爱代码爱编程

文章目录 一、吹个牛二、事务及它的特性三、简单看下两阶段提交的流程四、两阶段写日志用意?五、加餐:sync_binlog = 1 问题六、如何判断binlog和redolog是否达成了一致七、两阶段提交设计的初衷 - 分布式事务八、再看MySQL两阶段写日志九、留一个彩蛋十、推荐阅读(公众号首发,欢迎关注白日梦) 一、吹个牛 面试官的一句:“

面试经常问到MySQL两阶段提交串,你能回答出几成?-爱代码爱编程

一、吹个牛 面试官的一句:“了解MySQL的两阶段提交吗?” 不知道问凉了多少人! 这篇文章白日梦就和大家分享什么是MySQL的两阶提交到底是怎么回事!不管你原来晓不晓得两阶段提交,相信我!这篇文章中你一定能get到新的知识! 在说两阶段提交之前,大家要了解undo-log、redo-log、binlog。 先了解它们,才能更好的理解什么是

mysql update实质_被面试官问“Mysql”,update 语句到底做了些什么?-爱代码爱编程

推荐阅读: 面试“阿里云”居然一面就惨被吊打?幸终得内推机会,4面喜提华为offer​zhuanlan.zhihu.com 图标 问题: 一条简单的update 的语句到底牵扯了多少的东西?你能完全说明白吗? 来看看具体流程: ## student 只有id, 和name 两个字段,且只有id 一个主键,无其他索引。update stu

MySQL面试常问:一条语句提交后,数据库都做了什么?-爱代码爱编程

今天大部分程序需要处理的数据,都来自数据库,尤其是关系型数据库,那么一条 SQL 提交到数据库之后,数据库都做了些什么?如果不懂这些问题,就无法更好的使用数据库,更无法回答好面试官的问题。现在流行的开源数据库,非 MySQL 莫属,面试中 MySQL 也是必问,于是我就学习了专栏《MySQL实战45讲》,今天的文章试着回答以下两个问题: 1、一条

阿里面试官告诉你面试Java后端开发会被问到什么问题?-爱代码爱编程

面试java后端开发,基本上会问你一些理论基础,以及你对一些技术点的理解,或者说深一点问一问你所掌握的深浅如何? 如果之前有实习经验,还会问一些你做过的项目,以及你在其中担任的角色,就是说你负责写的模块功能 等等。 计算机网络基础 无论是开发、运维、还是测试,计算机网络基础是必备的技术栈之一,也是我们日常面试中常问的知识之一。所以,对于计算机网络的一些基

面试官:3pc提交协议是什么?_熬夜加班写代码的博客-爱代码爱编程

CanCommit阶段 3PC的CanCommit阶段其实和2PC的准备阶段很像。协调者向参与者发送commit请求,参与者如果可以提交就返回Yes响应,否则返回No响应。 1.事务询问 协调者向参与者发送CanCommit请求。询问是否可以执行事务提交操作。然后开始等待参与者的响应。 2.响应反馈 参与者接到CanCommit请求之后,正常

聊聊 mysql 事务二阶段提交_90后小伙追梦之路的博客-爱代码爱编程

二阶段提交的核心逻辑是把多个事务的 Redo 日志合并刷盘,把多个事务的 binlog 日志合并刷盘,从而把少量数据多次 IO 变为更大数据更少 IO,最终达到提升事务提交效率的目标。 回想当年,高并发还没有这么普遍,分布式也没有这么流行。 初次接触二阶段提交,源于想以事务的方式实现对 MongoDB 中多个集合数据的修改,而 MongoDB 本身不支

被面试官问住了,mysql两阶段提交是什么鬼?-爱代码爱编程

前言 MySQL通过两阶段提交的机制,保证了redo log和bin log的逻辑一致性,进而保证了数据的不丢失以及主从库的数据一致。 而说起两阶段提交,就不得不先介绍一下redo log和bin log。 redo

【计算机毕业设计】springboot“漫画之家”系统-爱代码爱编程

系统主要功能 通过市场调研及咨询研究,了解了用户及管理者的使用需求,于是制定了管理员和用户等模块。功能结构图如下所示: 演示视频 系统功能模块 “漫画之家”系统 ,在系统首页可以查看首页,漫画,同人插画,漫画活动,商

mongodb 基础命令速查指南-爱代码爱编程

MongoDB 是一个广泛使用的 NoSQL 数据库,以其灵活的数据模型、易于扩展和高性能而受到开发者的喜爱。本文将提供 MongoDB 的一些基本命令,包括数据库操作、集合操作和文档操作等,以帮助开发者快速入门 Mongo

事务日志与 两阶段提交-爱代码爱编程

文章目录 Redo Log redo的优点 redo的组成 redo的整体流程 不同刷盘策略演示 Undo Log 两阶段提交

阿里面试官:mysql是如何实现acid的?_面试mysql acid 实现_小龙coding的博客-爱代码爱编程

微信公众号原文链接,排版更舒适 作为二本上岸大厂的后端应届生,深知没人带一路摸索的艰辛,想把自己的心路历程与经验心得收获分享给大家。后期大厂面试系列持续更新中… 一、前文 之前有同学在面阿里二面被问到:MYSQL是如何

面试官问我为啥b+树一般都不超过3层?3层b+树能存多少数据?redo log与binlog的两阶段提交?_b+树为什么层数低-爱代码爱编程

我今天逛了一下CSDN,又发现了一条显眼的数据,大概是说3层B+树足以容纳2000w条数据。我当时就蒙了,3层对2000w,心想这B+树也太厉害了吧,由此勾起了我求知的欲望,我一定要搞明白他这2000w是怎么来的。 重中之重 MySQL的执行流程如下图 在两阶段提交的情况下,是怎么实现崩溃恢复的? 前提:binlog本身不具备crash-saf

mysql两阶段提交串讲_mysql二阶段提交-爱代码爱编程

目录: 一、吹个牛 二、事务及它的特性 三、简单看下两阶段提交的流程 四、两阶段写日志用意? 五、加餐:sync_binlog = 1 问题 六、如何判断binlog和redolog是否一致 七、两阶段提交设计的初衷 - 分布式事务 八、再看MySQL两阶段写日志 九、留一个彩蛋 十、推荐阅读 一、吹个牛 面试官的一句:“了解