redo log 和binlog的相关问题及其衍生

news2025/1/11 22:54:01

目录

 下在两阶段提交的不同时刻,MySQL异常重启会出现什么现象。

那么, MySQL怎么知道binlog是完整的?

 redo log 和 binlog是怎么关联起来的?

 处于prepare阶段的redo log加上完整binlog,重启就能恢复,MySQL为什么要这么设计?

如果这样的话,为什么还要两阶段提交呢?⼲脆先redo log写完,再写binlog。崩溃恢复的时候,必须 得两个⽇志都完整才可以。是不是⼀样的逻辑?

不引⼊两个⽇志,也就没有两阶段提交的必要了。只⽤binlog来⽀持崩溃恢复,⼜能⽀持归档,不就可以了?

能不能反过来,只⽤redo log,不要binlog?

redo log一般设置多大?

正常运⾏中的实例,数据写⼊后的最终落盘,是从redo log更新过来的还是从buffer pool更新过来的呢?


 下在两阶段提交的不同时刻,MySQL异常重启会出现什么现象。

如果在图中时刻A的地⽅,也就是写⼊redo log 处于prepare阶段之后、写binlog之前,发⽣了崩溃(crash),由于此时binlog还没写,redo log也还没提交,所以崩溃恢复的时候,这个事务会回滚。这时候,binlog还没写,所以也不会传到备库。

对于时刻B,也就是binlog写完,redo log还没commit前发⽣crash,那崩溃恢复的时候MySQL会 怎么处理? 我们先来看⼀下崩溃恢复时的判断规则。:

1. 如果redo log⾥⾯的事务是完整的,也就是已经有了commit标识,则直接提交;

2. 如果redo log⾥⾯的事务只有完整的prepare,则判断对应的事务binlog是否存在并完整:

a. 如果是,则提交事务;

b. 否则,回滚事务。

这⾥,时刻B发⽣crash对应的就是2(a)的情况,崩溃恢复过程中事务会被提交。

那么, MySQL怎么知道binlog是完整的?

 ⼀个事务的binlog是有完整格式的:

statement格式的binlog,最后会有COMMIT;

row格式的binlog,最后会有⼀个XID event。

另外,在MySQL 5.6.2版本以后,还引⼊了binlog-checksum参数,⽤来验证binlog内容的正确性。对于binlog⽇志由于磁盘原因,可能会在⽇志中间出错的情况,MySQL可以通过校验checksum的结果来发现。所以,MySQL还是有办法验证事务binlog 的完整性的。 

 redo log 和 binlog是怎么关联起来的?

 它们有⼀个共同的数据字段,叫XID。崩溃恢复的时候,会按顺序扫描redo log:

  • 如果碰到既有prepare、⼜有commit的redo log,就直接提交
  • 如果碰到只有parepare、⽽没有commit的redo log,就拿着XID去binlog找对应的事务。

 处于prepare阶段的redo log加上完整binlog,重启就能恢复,MySQL为什么要这么设计?

其实,这个问题还是跟我们在反证法中说到的数据与备份的⼀致性有关。在时刻B,也就是binlog写完以后MySQL发生崩溃,这时候binlog已经写⼊了,之后就会被从库(或者⽤这个binlog恢复出来的库)使⽤。

所以,在主库上也要提交这个事务。采⽤这个策略,主库和备库的数据就保证了⼀致性

如果这样的话,为什么还要两阶段提交呢?⼲脆先redo log写完,再写binlog。崩溃恢复的时候,必须 得两个⽇志都完整才可以。是不是⼀样的逻辑?

 两阶段提交是经典的分布式系统问题,并不是MySQL独有的。如果必须要举⼀个场景,来说明这么做的必要性的话,那就是事务的持久性问题。

对于InnoDB引擎来说,如果redo log提交完成了,事务就不能回滚(如果这还允许回滚,就可能覆盖掉别的事务的更新)。⽽如果redo log直接提交,然后binlog写⼊的时候失败,InnoDB⼜回滚不了,数据和binlog⽇志⼜不⼀致了。两阶段提交就是为了给所有⼈⼀个机会,当每个⼈都说“我ok”的时候,再⼀起提交。

不引⼊两个⽇志,也就没有两阶段提交的必要了。只⽤binlog来⽀持崩溃恢复,⼜能⽀持归档,不就可以了?

这个问题的意思是,只保留binlog,然后可以把提交流程改成这样:… -> “数据更新到内存” -> “写 binlog” -> “提交事务”,是不是也可以提供崩溃恢复的能⼒?

答案是不可以的。只⽤binlog来实现崩溃恢复的流程,如图所示

 这样的流程下,binlog还是不能⽀持崩溃恢复的。:binlog没有能⼒恢复“数据⻚”

如果在图中标的位置,也就是binlog2写完了,但是整个事务还没有commit的时候,MySQL发⽣了crash。

重启后,引擎内部事务2会回滚,然后应⽤binlog2可以补回来;但是对于事务1来说,系统已经认为提交完成了,不会再应⽤⼀次binlog1

但是,InnoDB引擎使⽤的是WAL技术,执⾏事务的时候,写完内存和⽇志,事务就算完成了。如果之后崩溃,要依赖于⽇志来恢复数据⻚也就是说在图中这个位置发⽣崩溃的话,事务1也是可能丢失了的,⽽且是数据⻚级的丢失。此时,binlog⾥⾯并没有记录数据⻚的更新细节,是补不回来的。

能不能反过来,只⽤redo log,不要binlog?

可以把binlog关掉,这样就没有两阶段提交了,但系统依然是crash-safe的。⼀个是归档。redo log是循环写,写到末尾是要回到开头继续写的。这样历史⽇志没法保留,redo log也就起不到归档的作用。

⼀个就是MySQL系统依赖于binlog。binlog作为MySQL⼀开始就有的功能,被⽤在了很多地⽅。其中,MySQL系统⾼可⽤的基础,就是binlog复制。

redo log一般设置多大?

4个1G文件。

正常运⾏中的实例,数据写⼊后的最终落盘,是从redo log更新过来的还是从buffer pool更新过来的呢?

实际上,redo log并没有记录数据⻚的完整数据,所以它并没有能⼒⾃⼰去更新磁盘数据⻚,也就不存在“数据最终落盘,是由 redo log更新过去”的情况。

1. 如果是正常运⾏的实例的话,数据⻚被修改以后,跟磁盘的数据⻚不⼀致,称为脏⻚。最终数据落盘,就是把内存中的数据⻚写盘。这个过程,甚⾄与redo log毫⽆关系。

2. 在崩溃恢复场景中,InnoDB如果判断到⼀个数据⻚可能在崩溃恢复的时候丢失了更新,就会将它读到内存,然后让redo log更新内存内容。更新完成后,内存⻚变成脏⻚,就回到了第⼀种情况的状态。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/94659.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ensp环境 AC+AP组网及ACweb界面配置

1.进入交换机划分Vlan并且配置好每条链路 The device is running! <Huawei>system-view [Huawei]sysname SW1 [SW1]vlan batch 100 101 [SW1]interface GigabitEthernet 0/0/2 [SW1-GigabitEthernet0/0/2]port link-type trunk [SW1-GigabitEthernet0/0/2]port trunk…

C++:类和对象:对象的初始化和清理

1 前言&#xff1a; 构造和析构的背景 1&#xff1a;C中的面向对象来源于生活&#xff0c;每个对象都会有初始值以及对象销毁前的清理数据设置 2&#xff1a;对象的初始化和清理是两个非常重要的安全问题&#xff0c;一个对象或者变量没有初始状态&#xff0c;对其使用后果是未…

左旋咪唑大单层/青蒿素长循环/酒石酸长春瑞滨热敏/棕榈酰五肽-4柔性/Anti-HER2免疫脂质体的研究

小编今天为大家分享了左旋咪唑大单层/青蒿素长循环/酒石酸长春瑞滨热敏/棕榈酰五肽-4柔性/Anti-HER2免疫脂质体的制备研究。 青蒿素长循环脂质体的制备&#xff1a; 青蒿素(artemisinin,ART)由于溶解度差,稳定性低,限制了其应用.因此,本研究采用长循环脂质体包裹青蒿素,增强其…

RDD中groupByKey和reduceByKey区别

groupByKey和reduceByKey区别 groupByKey 每个分区不聚合&#xff0c;等最终分组完成后调用Reduce再聚合 适用于求平均数、中位数等情况 reduceByKey 每个分区并行计算先实现分区内部聚合&#xff0c;然后再将每个分区的结果做最终的聚合实现分区间聚合 等同于MR中Combin…

电商之收单系统的webhook推送重试机制

文章目录1 问题背景2 前言3 解决方案3.1 核心思路3.2 数据库设计3.3 下一次发送webhook的时间算法3.3 详细设计4 延申思考1 问题背景 作为一个收单系统&#xff0c;当获取到一笔交易的支付结果时&#xff0c;就需要发送一个webhook消息给电商系统。电商系统收到webhook消息后&a…

4. Bean的生命周期

Bean的生命周期 1.生命周期相关概念介绍 生命周期&#xff1a;从创建到消亡的完整过程bean生命周期&#xff1a;bean从创建到销毁的整体过程bean生命周期控制&#xff1a;在bean创建后到销毁前做一些事情 2. Bean销毁时机 容器关闭前触发bean的销毁 关闭容器方式&#xff…

前端基础—Ajax和XML

Ajax和XML 说到这里&#xff0c;就不得不提到另一个概念&#xff1a;Ajax&#xff08;Asynchronous JavaScript&#xff09;&#xff0c;中文可以称之为“js的异步请求”&#xff0c;国内统一称为Ajax。 Ajax的概念是每次打开新的网页时&#xff0c;不要让页面整体刷新&#…

Java学习笔记 --- MySQL-常用数据类型

一、Mysql常用数据类型 二、数值型(整数)的基本使用 使用规范&#xff1a;在能够满足需求的情况下&#xff0c; 尽量选择占用空间小的 # 演示整形的使用 # 使用tinyint来演示范围 有符号 -128 ~ 127 如果没有符号 0-255 # 1. 如果没有指定 unsigned&#xff0c;则TINYINT就是…

卡塔尔世界杯门线技术(GOAL LINE TECHNOLOGY)背后的黑科技

现代职业足球运动员踢球时足球的行进速度&#xff0c;据国际足联统计数据&#xff0c;平均速度可达 60 英里/小时。极少数爆发力超强的职业球员&#xff0c;可以将这个速度刷新到超过 100 英里/小时。比如里斯本竞技队的巴西左后卫罗尼赫伯森在 2006 年以 131.82 英里/小时的速…

HACKTHEBOX——Sunday

nmap 第一次没有进行全端口扫描&#xff0c;只发现了79和111端口&#xff0c;79端口运行着finger程序&#xff0c;111则是rpcbind。 重新扫描一次&#xff0c;这次针对全部端口进行扫描。 nmap -p- -oA nmap 10.10.10.76 然后在扫描端口详细信息 可以发现22022端口运行着ssh…

数据结构——查找最全总结(期末复习必备)

目录 查找的基本概念 线性表的查找 顺序查找 折半查找&#xff08;二分或对分查找&#xff09; 分块查找&#xff08;索引顺序查找&#xff09; 树表的查找 二叉排序树 定义&#xff1a; 二叉排序树的查找&#xff1a; 二叉排序树的插入&#xff1a; 二叉排序树的创建&…

【缺陷识别】SVM金属表面缺陷分类与测量【含GUI Matlab源码 682期】

⛄一、简介&#xff08;附lunwen、答辩PPT&#xff09; 1 题目内容 金属板广泛应用在工业生产与生产生活的各方面。由于金属板制造过程涉及到的设备、工艺等多因素的影响&#xff0c;金属板表面容易出现种类较多、形态各异的缺陷&#xff0c;这些缺陷对金属板的耐磨性、抗腐蚀…

取整的四种方式

取整的四种方式一.基本认识二.四种取整方案1.零向取整2.地板取整3.向右取整4.四舍五入一.基本认识 这里按理说5/2应该为2.5啊&#xff0c;怎么为2呢&#xff1f;按照我们曾经的理解&#xff0c;其实知道符号/其实是取整。但它究竟是如何取整呢&#xff1f; 二.四种取整方案 1.…

小啊呜产品读书笔记001:《邱岳的产品手记-16》第30讲产品案例分析:Primer的扑克牌交互 第31讲 产品分析的套路(下):如何出解决方案?

小啊呜产品读书笔记001&#xff1a;《邱岳的产品手记-16》第30讲产品案例分析&#xff1a;Primer的扑克牌交互 & 第31讲 产品分析的套路&#xff08;下&#xff09;&#xff1a;如何出解决方案&#xff1f;一、今日阅读计划二、泛读&知识摘录1、第30讲产品案例分析&…

猿如意中的【Visual Studio Code】工具详情介绍

猿如意中的【Visual Studio Code】工具一、 猿如意工具介绍二、 工具名称2.1 下载安装渠道2.2 如何在载猿如意中下载VS Code开发工具&#xff1f;2.3 安装流程2.4 安装完成的界面2.6 VS Code使用步骤常用快捷键使用感受一、 猿如意工具介绍 打开猿如意程序工具。猿如意下载地址…

东北大学2023分布式操作系统考试题目

1、简述分布式系统的设计目标中开放性的特点有哪些&#xff1f; 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 2、简述分布式体系结构中的层次结构&#xff0c;并举出一个层次结构的例子 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 …

20222-02-16 Linux 触摸屏测试工具tslib工具下载、编译、安装,buildroot ARM平台上实际运行

一、tslib全称英文是C library for filtering touchscreen events&#xff0c;是捕捉触摸屏事件的工具。 二、下载地址https://github.com/libts/tslib 三、tslib的代码如下 二、ARM交叉编译流程 1、可能需要安装下面的软件 sudo apt-get install automake autoconf libtool …

数据结构之链表 - (通过代码实现方法,熟悉方法的使用)

文章目录前言1. 链表1.1 什么是链表&#xff1f;1.2 链表的分类2. 链表方法的实现2.1 实现构建思想2.2 代码实现2.2.1 实现方法前的准备工作2.2.2 链表方法:display() - 打印链表, contains() - 查找链表中key值, size() - 求链表长度2.2.3 头插法-addFirst(), 尾插法-addLast(…

比较生成模型

说说GAN/VAE/Flow/Diffusion/AR~~~ 各类生成模型&#xff0c;比如自回归模型Autoregressive Model (AR)&#xff0c;生成对抗网络Generative Adversarial Network (GAN)&#xff0c;标准化流模型Normalizing Flow (Flow)&#xff0c;变分自编码器Variational Auto-Encoder (VA…

软件测试优秀的测试工具,会用三款工作效率能提升一半

我们将常用的测试工具分为10类。 1. 测试管理工具 2. 接口测试工具 3. 性能测试工具 4. C/S自动化工具 5.白盒测试工具 6.代码扫描工具 7.持续集成工具 8.网络测试工具 9.app自动化工具 10.web安全测试工具 注&#xff1a;工具排名没有任何意义。 大多数初学者&…