redo log与binlog间的破事
Posted 程序猿阿星
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redo log与binlog间的破事相关的知识,希望对你有一定的参考价值。
前言
阿星在前面两篇文章都详细聊过redo log
与binlog
,有兴趣的朋友可以去看看前面两篇文章:
今天就来聊聊InnoDB
是如何保证redo log
与binlog
两份日志之间的逻辑一致。
两阶段提交
redo log
(重做日志)让InnoDB
存储引擎拥有了崩溃恢复能力。
binlog
(归档日志)保证了mysql
集群架构的数据一致性。
虽然它们都属于持久化的保证,但是则重点不同。
在执行更新语句过程,会记录redo log
与binlog
两块日志,以基本的事务为单位,redo log
在事务执行过程中可以不断写入,而binlog
只有在提交事务时才写入,所以redo log
与binlog
的写入时机不一样。
回到正题,redo log
与binlog
两份日志之间的逻辑不一致,会出现什么问题?
我们以update
语句为例,假设id=2
的记录,字段c
值是0
,把字段c
值更新成1
,SQL
语句为update T set c=1 where id=2
。
假设执行过程中写完redo log
日志后,binlog
日志写期间发生了异常,会出现什么情况呢?
由于binlog
没写完就异常,这时候binlog
里面没有对应的修改记录。因此,之后用binlog
日志恢复数据时,就会少这一次更新,恢复出来的这一行c
值是0
,而原库因为redo log
日志恢复,这一行c
值是1
,最终数据不一致。
为了解决两份日志之间的逻辑一致问题,InnoDB
存储引擎使用两阶段提交方案。
原理很简单,将redo log
的写入拆成了两个步骤prepare
和commit
,这就是两阶段提交。
使用两阶段提交后,写入binlog
时发生异常也不会有影响,因为MySQL
根据redo log
日志恢复数据时,发现redo log
还处于prepare
阶段,并且没有对应binlog
日志,就会回滚该事务。
再看一个场景,redo log
设置commit
阶段发生异常,那会不会回滚事务呢?
并不会回滚事务,它会执行上图框住的逻辑,虽然redo log
是处于prepare
阶段,但是能通过事务id
找到对应的binlog
日志,所以MySQL
认为是完整的,就会提交事务恢复数据。
站在巨人的肩膀上
- 《MySQL实战45讲》
- 《从零开始带你成为MySQL实战优化高手》
- 《MySQL技术Innodb存储引擎》
MySQL好文推荐
白嫖福利
给粉丝的高质量福利,低调领取哈~
以上是关于redo log与binlog间的破事的主要内容,如果未能解决你的问题,请参考以下文章
MYSQL INNODB的REDO LOG与BINLOG的区别
MySQL面试不用慌!跟着老司机吃透Redo log 与 Binlog