当前位置:网站首页>redo log与binlog间的破事
redo log与binlog间的破事
2022-08-02 03:28:00 【hebiwen95】
今天就来聊聊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认为是完整的,就会提交事务恢复数据。
边栏推荐
- Activity
- (不重点考)试算平衡的分类
- Dart-Flutter DateTime日期转换
- [Hello World教程] 使用HBuilder和Uni-app 生成一个简单的微信小程序DEMO
- 同态加密:CKKS原理之旋转(Rotation)
- View的滑动
- WeChat applet development video loading: [Rendering layer network layer error] Failed to load media
- The first time to tear the code by hand, how to solve the problem of full arrangement
- Kotlin - 延迟初始化和密封类
- 完整安装 Laravel-Admin 框架
猜你喜欢

Binder机制详解(二)

Cookie is used to collect the admin privileges CTF foundation problem

Gradle源码解析:生命周期的三个阶段

How to calculate the distance between two points on the earth (with formula derivation)

深入了解为何面试官常说:你还没准备好,我不会录用你
![WeChat applet development video loading: [Rendering layer network layer error] Failed to load media](/img/24/e12a1312aee28a43428b2ae0bfbe00.png)
WeChat applet development video loading: [Rendering layer network layer error] Failed to load media

会计账簿、会计账簿概述、会计账簿的启用与登记要求、会计账簿的格式和登记方法

gradle脚本中groovy语法讲解

备战金九银十:Android 高级架构师的学习路线及面试题分享

考(重点理解哪些属于其他货币资金)、其他货币资金的内容、其他货币资金的账务处理(银行汇票存款、银行本票存款、信用卡存款、信用证保证金存款、存出投资款、外埠存款)
随机推荐
The CTF introductory notes of SQL injection
公司产品太多了,怎么实现一次登录产品互通?
链动2+1无限循环系统,2022年起盘成功率超高的模式
如何在正则表达式里表达可能存在也可能不存在的内容?
umi3 权限路由PrivateRoute未执行
【泰山众筹】模式为什么一直都这么火热?是有原因的
CTF-Neting Cup Past Topics
重点考:从债劵的角度来看交易性金融资产
View的滑动
VS2017报错:LNK1120 1 个无法解析的外部命令
大厂底层必修:“应用程序与 AMS 的通讯实现”
关于我的大创、论文~
3D建模作品
Glide中图片处理
Debian 12 Bookworm 尝鲜记
File upload vulnerability
synchronized锁原理详解
Dart-Flutter DateTime日期转换
SATA M2 SSD 无法安装系统的解决方法
kotlin语法总结(二)