面试官:MySQL Redo Log 和 Binlog 有什么区别?分别用在什么场景?
Redo Log 保存在 InnoDB 中,用于保证宕机后数据不丢,是 MySQL 支持数据库事务的基础。Binlog 保存在 MySQL server 层,用于主从同步或点播恢复。
免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈
MySQL 的 Redo Log 和 Binlog是两种完全不同、但又紧密协同的日志机制。理解这两种日志,对理解MySQL的事务机制有重要帮助。今天来聊一聊这两种日志。
1.概念回顾
1.1 两阶段提交
我们知道,分布式事务一般都是使用两阶段提交达到最终一致。比如下图一个购买商品的案例,用户下订单后,订单服务保存订单,账户服务扣减金额,库存服务扣减库存。这三个服务通过两阶段提交,先prepare,然后commit最终实现事务一致性。
图片
1.2 事务提交
我们再来看一下MySQL的逻辑架构,看下图:
图片
在 MySQL逻辑架构中,执行器负责执行具体的SQL,跟存储引擎进行交互。
执行器就是两阶段提交的“事务协调者”,事务执行过程如下图:
图片
假如我们要执行一条SQL:
update t set a=10 where id=5;
这个 SQL的执行过程如下:
执行器先从存储引擎拿到id=5这一行数据,然后把这一行数据的字段 a 改成 10,再把这行修改后的数据写入存储引擎。prepare阶段:存储引擎将这行新数据写入内存,同时将这行数据的更新操作记录到Redo Log ,但不提交事务,然后给执行器返回成功。此时Redo Log 处于 prepare状态。执行器为这行数据的更新操作生成 Binlog 并写入磁盘,当然,是否刷盘要根据sync_binlog配置来决定。commit阶段:执行器通知存储引擎提交事务,存储引擎把刚刚写入的Redo Log改成提交commit状态,完成事务提交。2.Redo Log
2.1 介绍
从前面介绍可以看到,Redo Log是存储引擎层控制的日志,事实上,Redo Log 是 InnoDB 存储引擎特有的日志,它是一个物理日志, 记录了在某个数据页上做了哪些修改,主要用于崩溃恢复。
Redo Log的刷盘机制通过下面参数来控制:
innodb_flush_log_at_trx_commit0:事务提交时,Redo Log不会被立刻被写入磁盘,而是存在缓存中(Redo Log Buffer),InnoDB后台日志线程每秒将日志从缓冲区写入文件系统缓存(Page Cache),然后调用fsync落盘。优点是减少了I/O操作,提升了性能,缺点是如果MySQL服务挂了,或者操作系统宕机,可能丢失1s的数据。1:默认值。事务提交时,Redo Log立即写入Page Cache,并调用 fsync保存磁盘,优点是系统宕机时丢失数据风险小,缺点是磁盘I/O操作频繁,影响性能。2:事务提交时,Redo Log被直接写入到Page Cache,然后依赖操作系统的刷盘机制将Page Cache中的日志写入磁盘,优点是性能好,如果MySQL服务挂了,并不会导致数据丢失,只有操作系统宕机,Page Cache未刷盘的数据才会丢失。
2.2 写日志
在写数据时,Redo Log是循环写,空间大小固定,写满后会覆盖掉前面的日志。
Redo Log采用固定大小的文件组,比如下图文件组配置了 4 个文件,每个文件大小相同,写满一个后接着写下一个,全部写满后就清除一部分前面的日志,继续写入。write pos控制当前写入的位置,check point控制可以写入的最后位置,如果两个点重合了,那就需要清除部分日志,让check point 后移。
图片
2.3 Redo Log 使用场景
崩溃恢复
这是 Redo Log最根本的用途。它确保了数据库宕机后,已提交事务的数据不会丢失。Redo Log 基于 WAL (Write-Ahead Logging)原则,即先写日志,再写磁盘。事务提交时,先将修改内容的记录到Redo Log,MySQL宕机重启后,利用Redo Log做崩溃恢复。恢复过程如下。
首先,InnoDB会检查数据页的LSN(日志序列号),并与Redo Log 中的 LSN 对比。Redo Log 上 LSN比数据页大的就是需要重做的数据。
接着,InnoDB会扫描Redo Log中要恢复的日志,如果日志状态是COMMIT,则直接重做。如果日志状态是PREPARE,则还要去检查对应的Binlog,如果该事务的Binlog存在且完整,说明事务已经提交成功,应该重做。如果该事务的Binlog不存在或不完整,说明事务应该回滚,Redo Log日志不进行重做。
图片
通过这个机制,确保了Redo Log 和 Binlog的逻辑一致性:只要Binlog写成功了,数据就一定能够被恢复;如果Binlog没写成功,说明事务应该被回滚,数据无需恢复。
优化性能
通过将数据文件随机写磁盘转换为Redo Log顺序写磁盘,大大提升了事务执行效率和数据库整体吞吐量。
3.Binlog
3.1介绍
Binlog 是 MySQL Server层的日志,所有引擎都可以使用。它是一个逻辑日志,记录的是数据逻辑的变化(比如插入一条数据),用于主从复制和故障恢复。
跟 Redo Log写日志方式不同的是, Binlog是追加写,写满一个文件后切换到下一个文件写。
3.2 刷盘时机
MySQL 中 sync_binlog参数定义了将Binlog内容从内存缓冲区同步到磁盘的频率。
0:MySQL 不会主动将 Binlog内容同步到磁盘,完全依赖文件系统刷盘机制来落盘。这种方式磁盘I/O操作较少,性能最好,但存在数据丢失的风险。1:每次事务提交时,都会将Binlog内容同步到磁盘。这种方式丢失数据的风险较小,但因为磁盘I/O操作多,容易影响数据库性能。N(N>1):每 N 个事务提交后,才会将 Binlog内容同步到磁盘。这种方式是前两种方式的折中,既考虑了一定的性能,也兼顾了数据的安全性。3.3 Binlog 使用场景
主从复制
这是 Binlog最重要的用途。在主从架构中,Master节点将自己的Binlog发送给Slave 节点,Slave通过重放Binlog 中的 SQL语句,实现数据同步。
点播恢复
因为 Binlog完整记录了对数据库的所有更改操作,它可以通过重放来恢复某一个时间段的全部数据。在实际工作中,有时我们需要恢复数据库到某一个历史时间点的状态,这时我们可以找出这个时间点之前最近的一个全量备份,用这个全量备份恢复到一个空数据库,然后找出全量备份时间点到目标时间点之间所有 Binlog 文件并进行回放。这样就实现了精确的时间点恢复。这对于修复误操作(如误删表、误更新)非常有用。
总结
Redo Log 保存在 InnoDB中,用于保证宕机后数据不丢,是MySQL支持数据库事务的基础。Binlog 保存在 MySQL server 层,用于主从同步或点播恢复。
两者分工明确但又紧密协作,共同保障了MySQL数据安全和高可用性。
为了让两个日志区别更清晰,总结下表:
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
同类文章
北京推进智能网联新能源车险,支持L2-L4级别统一适配
3月29日,北京已在全国率先启动智能网联新能源汽车商业保险产品开发应用。新产品基本沿用现有的新能源商业车险体系,按照“总体稳定、部分优化”的原则,主要为消费者和汽车企业关心的特定智驾场景、软硬件损失
苹果今年将发布两款新iPhone应用,包含聊天机器人
预计苹果今年将发布两款新的 iPhone 应用,包括 Apple Business 应用和一款具备类似聊天机器人功能的 Siri 应用。借助 Apple Business 应用,使用全新 Apple
苹果聘请前谷歌副总裁分管AI产品营销
据 Axios 报道,苹果公司已聘请前谷歌副总裁 Lilian Rincon 担任人工智能产品营销副总裁。加入苹果之前, Rincon 曾任谷歌购物产品副总裁。在苹果, Rincon 将负责苹果所有
雷军销售心法:一句话卖出一辆车,金牌销售的秘诀
3月29日消息,谁能料到前段时间奥迪车主与雷军之间的那个打赌,竟然还有后续。这到底是咋回事?事情发生在3月25日,网友@单手开吉利 在雷军的微博评论区晒出了自己去年10月刚提的奥迪车,还当场立下一个
跨国工业巨头为何入局中国机器人市场?
近期,上百家来自全球跨国企业的CEO齐聚中国,参加中国发展高层论坛。第一财经记者了解到,不少全球高管利用此次访华之际,参观了中国先进制造企业,包括电动汽车、智能家电以及人形机器人厂商。芬兰电梯巨头通
- 日榜
- 周榜
- 月榜
相关攻略
2015-03-10 11:25
2015-03-10 11:05
2021-08-04 13:30
2015-03-10 11:22
2015-03-10 12:39
2022-05-16 18:57
2025-05-23 13:43
2025-05-23 14:01
热门教程
- 游戏攻略
- 安卓教程
- 苹果教程
- 电脑教程

