首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

关于redo log与binlog的那些事儿

本文读完需3分钟,速读仅需1分钟。

前言

阿星在前面两篇文章都详细聊过与,有兴趣的朋友可以去看看前面两篇文章:

今天就来聊聊是如何保证与两份日志之间的逻辑一致。

两阶段提交

(重做日志)让存储引擎拥有了崩溃恢复能力。

(归档日志)保证了集群架构的数据一致性。

虽然它们都属于持久化的保证,但是则重点不同。

在执行更新语句过程,会记录与两块日志,以基本的事务为单位,在事务执行过程中可以不断写入,而只有在提交事务时才写入,所以与的写入时机不一样。

回到正题,与两份日志之间的逻辑不一致,会出现什么问题?

我们以语句为例,假设的记录,字段值是,把字段值更新成,语句为。

假设执行过程中写完日志后,日志写期间发生了异常,会出现什么情况呢?

由于没写完就异常,这时候里面没有对应的修改记录。因此,之后用日志恢复数据时,就会少这一次更新,恢复出来的这一行值是,而原库因为日志恢复,这一行值是,最终数据不一致。

为了解决两份日志之间的逻辑一致问题,存储引擎使用两阶段提交方案。

原理很简单,将的写入拆成了两个步骤和,这就是两阶段提交

使用两阶段提交后,写入时发生异常也不会有影响,因为根据日志恢复数据时,发现还处于阶段,并且没有对应日志,就会回滚该事务。

再看一个场景,设置阶段发生异常,那会不会回滚事务呢?

并不会回滚事务,它会执行上图框住的逻辑,虽然是处于阶段,但是能通过事务找到对应的日志,所以认为是完整的,就会提交事务恢复数据。

站在巨人的肩膀上

《MySQL实战45讲》

《从零开始带你成为MySQL实战优化高手》

《MySQL技术Innodb存储引擎》

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20220113A0D9TK00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券