redo log与binlog间的破事

小哈学Java

共 1315字,需浏览 3分钟

 · 2021-08-20

前言

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

    两阶段提交

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

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

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

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

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

    我们以update语句为例,假设id=2的记录,字段c值是0,把字段c值更新成1SQL语句为update T set c=1 where id=2

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

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

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

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

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

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

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

    站在巨人的肩膀上

    • 《MySQL实战45讲》
    • 《从零开始带你成为MySQL实战优化高手》
    • 《MySQL技术Innodb存储引擎》

    1. 面试官:Spring AOP、AspectJ、CGLIB 都是什么鬼?它们有什么关系?

    2. 程序员表白代码来了,太秀了。。

    3. 蔚来一面:用Object做hashMap的Key时需要做什么?

    4. Nginx 入门到实战,新手必懂~

    最近面试BAT,整理一份面试资料Java面试BATJ通关手册,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。

    获取方式:点“在看”,关注公众号并回复 Java 领取,更多内容陆续奉上。

    文章有帮助的话,在看,转发吧。

    谢谢支持哟 (*^__^*)

    浏览 4
    点赞
    评论
    收藏
    分享

    手机扫一扫分享

    举报
    评论
    图片
    表情
    推荐
    点赞
    评论
    收藏
    分享

    手机扫一扫分享

    举报