基于Redo log Undo log的MySQL的崩溃恢复

基于Redo log & Undo log的MySQL的崩溃恢复

Redo log Undo log

Redo log 重做日志,记录,修改过的数据
Undo log 回滚日志,记录修改之前的数据

两个我不做详细的介绍了,redo log就是记录哪些地方被修改了
undo log是记录修改之前我们的数据长什么样

更新流程

在这里插入图片描述

我们来捋一下这个流程,首先是更新数据,会先去Buffer Pool中查找是否有这个页,如果说不存在这个页,就会从磁盘中加载,也就是第二步

第三步,有了这个页,我们需要先写Undo log,在一切开始之前,先记录没动过的样子

第四步,就是更新数据,先是写入Redo log Buffer中,因为一个事务中不止一个修改的地方,所以先写道Redo log Buffer中,一并写入到Redo log 文件中去

然后是写Binlog文件

其中有几点我们需要继续探讨

为什么要写入Redo log buffer中?我们修改完页,为什么不直接刷入到磁盘中去

这个问题很好理解,为什么修改之后,不直接刷入到磁盘去呢?因为这样子做,效率太低了,我们要刷入到磁盘的化,肯定是以页为单位的,一个页是16kb,而且还是随机IO,那样写的太慢了,我么redo log 文件,是顺序IO,性能快,而且不是完整的页

占用内存小,又快,肯定写到buffer中去,然后写到redo log file文件中啊

两阶段提交

binlog的一致性问题出现

你可能听过两阶段提交,就是为了解决binlog的一致性问题的

我们来想想,怎么会出现这个问题

刷盘的目的,无非就是两个目的,redo log写到磁盘中去,binlog写到磁盘中去

那无非就有两种方案
第一,先写redo log ,再写binlog
第二,先写bin log,再写redo log

第一种方案:
先写了redo log,bin log 还没写,MySQL宕机,redo log刷入了磁盘,bin log没有这条记录,此时bin log就丢失了记录,出现一致性问题

第二种方案:
先写bin log,redo log还没写,MySQL宕机,此时redo log没写,那么重启的时候,binlog 和redo log又不一样实际的数据又会丢失

所以我们必须保证一个事情,binlog 和 Redo log 必须保持一致性!!

为了这个目标就有两阶段提交,也就是2PC(two-phase commit protocool)

基于2PC

在这里插入图片描述
为了保证事务的一致性,所以就出现了2PC,它将事务的提交分成了两个不部分Prepare和Commit/Rollback

在这里插入图片描述

Prepare阶段,首先我们从Redo log Buffer种将Redo Log写入文件,然后刷入磁盘,记录上内部的XA事务的ID,同时将Redo log设置为Prepare状态,Redo log写入成功,再将Binlog同样刷入磁盘,记录XA事务的ID

Commit阶段,向磁盘种的Redo log写入Commit标识,表示事务提交,然后执行器调用存储引擎的接口提交事务.

验证

我们来验证两阶段提交是否可以保证一致性
首先,假设Redo log 刷入成功,但是还没来得及刷入Binlog,此时宕机,重启之后发现Redo log 没有commit标志,那么就会根据记录的XA事务Id找到这个事务,然后回滚

如果Redo log刷入成功,Binlog也刷入成功,还没来得及将Redo log从Prepare改成Commit,MySQL宕机,重启之后,发现虽然Redo log虽然没有commit标志,但是通过XA事务ID查询到的Binlog已经刷入到磁盘中去了额,此时MySQL也会提交事务

我比较困惑的时候,如果Redo log刷入盘了,打上了Prepare标志,但是写Binlog写到一半的时候,突然MySQL宕机了,此时还会有一致性问题,这里我先放下,之后我懂了再来更新这里的问题

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

海量物理刚体 高性能物理引擎Unity Physics和Havok Physics的简单性能对比

之前的博客中我们为了绕过ECS架构,相当于单独用Batch Renderer Group实现了一个精简版的Entities Graphics,又使用Jobs版RVO2实现了10w人同屏避障移动。 万人同屏对抗割草 性能测试 PC 手机端 性能表现 弹幕游戏 海量单位同屏渲染 锁敌 避障 非ECS 那么有…

【C语言】while循环语句

🎈个人主页:豌豆射手^ 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:C语言 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步&…

c#使用log4net的3种调用方法

https://blog.csdn.net/summer_top/article/details/107961245 第一步:下载log4net。 右键项目引用,进入管理NuGet包。 搜索log4net,下载安装。 第二步:创建LogHelper类。 public class LogHelper { private LogHelp…

【Android】View 的滑动

View 的滑动是 Android 实现自定义控件的基础,同时在开发中我们也难免会遇到 View 的滑动处理。其实不管是哪种滑动方式,其基本思想都是类似的:当点击事件传到 View 时,系统记下触摸点的坐标,手指移动时系统记下移动后…

docker 容器修改端口和目录映射

一、容器修改端口映射 一般在运行容器时,我们都会通过参数 -p(使用大写的-P参数则会随机选择宿主机的一个端口进行映射)来指定宿主机和容器端口的映射,例如 docker run -it -d --name [container-name] -p 8088:80 [image-name]…

Flask基础学习3

参考视频:41-【实战】答案列表的渲染_哔哩哔哩_bilibili flask 实现发送短信功能 pip install flask-mail # 安装依赖 我这里用登录的网易邮箱获取的授权码(登录QQ邮箱的授权码总是断开收不到邮件), # config # config mail MAI…

云尚办公-0.0.3

5. controller层 import pers.beiluo.yunshangoffice.model.system.SysRole; import pers.beiluo.yunshangoffice.service.SysRoleService;import java.util.List;//RestController:1.该类是控制器;2.方法返回值会被写进响应报文的报文体,而…

Dockerfile(4) - RUN 指令详解

RUN 运行命令 shell 形式 命令在 shell 中运行Linux 上默认为 /bin/sh -cWindows 上 cmd /S /C RUN <command> exec 形式 RUN ["executable", "param1", "param2"] 必须双引号&#xff0c;不能是单引号 两种写法的实际栗子 RUN …

java高级——反射

目录 反射概述反射的使用获取class对象的三种方式反射获取类的构造器1. 获取类中所有的构造器2. 获取单个构造器 反射获取构造器的作用反射获取成员变量反射变量赋值、取值获取类的成员方法反射对象类方法执行 反射简易框架案例案例需求实现步骤代码如下 反射概述 什么是反射 反…

骨传导耳机什么牌子的好?揭秘成功法则与避坑策略

科技进步带来了骨传导耳机的兴起&#xff0c;这种耳机以其独特的优势而受到越来越多消费者的青睐。与传统的入耳式相比&#xff0c;骨传导耳机通过骨头传递声音&#xff0c;避免了对耳道的直接压迫&#xff0c;减少了对听力的潜在伤害。同时它们允许用户在享受音乐的同时&#…

unity使用Registry类将指定内容写入注册表

遇到一个新需求&#xff0c;在exe执行初期把指定内容写入注册表&#xff0c;Playerprefs固然可以写入&#xff0c;但是小白不知道怎么利用Playerprefs写入DWORD类型的数据&#xff0c;因此使用了Registry类 一. 对注册表中键的访问 注册表中共可分为五类 一般在操作时&#…

中电金信精选好文,全篇划重点~

从硅谷银行件看中美金融监管差异 2023年3月&#xff0c;硅谷银行事件引发全球金融市场震荡&#xff0c;该事件除了给美联储从暴力降息到暴力升息的极限操作敲响一记警钟之外&#xff0c;更是暴露出美国金融监管漏洞重重的现状。相较之下&#xff0c;近年来我国不断深化金融监管…

Linux NFC 子系统剖析

1.总览 linux源码中NFC在net/nfc下&#xff0c;文件结构如下图&#xff1a; hci&#xff1a;Host Controller Interface 主要是针对NFC的主机-控制器接口协议 nci&#xff1a;NFC Controller Interface 主要是NFC的控制器接口协议&#xff0c;用于NFCC(NFC Controller)和DH(…

EAP-TLS实验之H3C MSR2600-10-X1配置相关

H3C MSR2600充当802.1x流程中的NAS&#xff08;Network Access System&#xff09;角色&#xff0c;一般负责实际待验证的设备与认证服务器之间沟通的桥梁&#xff08;当然也可以配置成认证服务器角色&#xff09;工作。在挑选购买支持802.1x的路由器或交换机时需要跟厂家明确是…

【python基础学习08课_函数的嵌套、内置函数等】

一、函数 1、函数的注释 1&#xff09;如何写注释 """ 函数的注释 -- 说明这个函数的作用&#xff0c;以及参数的诠释"""三个引号之间可以注释例如&#xff1a;这是一段注释"""这是一段注释""" 2&#xff09;如…

SVN教程-SVN的基本使用

SVN&#xff08;Apache Subversion&#xff09;是一款强大的集中式版本控制系统&#xff0c;它在软件开发项目中扮演着至关重要的角色&#xff0c;用于有效地跟踪、记录和管理代码的演变过程。与分布式系统相比&#xff0c;SVN 的集中式架构使得团队能够更加协同地进行开发&…

计算机网络之应用层

域名由点和标号(label)组成, 点分割的即是标号每个标号不超过63个字符,总计不超过255个字符, 并且不区分大小写顶级域名TLD(Top Level Domain)分为三类, 国家顶级域名nTLD, 通用顶级域名gTLD, 基础结构域名ID(Infrastructure Domain). 基础结构域名只有一个即 arpa. 用于反向域…

MyBatis 学习(二)之 第一个 MyBatis 案例

目录 1 配置 MyBatis 方式 1.1 XML 配置文件 1.2 Java 注解配置 1.3. Java API 配置 2 在 MySQL 中创建一张表 3 创建一个基于 Maven 的 JavaWeb 工程 4 编写 User 实体类 5 创建 Mybatis 全局配置文件 6 编写一个 DAO 或 Mapper 接口 7 编写 SQL 映射配置文件&#…

Docker部署前后端服务示例

使用Docker部署js前端 1.创建Dockerfile 在项目跟目录下创建Dockerfile文件&#xff1a; # 使用nginx作为基础镜像 FROM nginx:1.19.1# 指定工作空间 WORKDIR /data/web# 将 yarn build 打包后的build文件夹添加到工作空间 ADD build build# 将项目必要文件添加到工作空间&a…

IPD(集成产品开发)—核心思想

企业发展到一定阶段就会遇到管理瓶颈&#xff0c;IPD流程是一种高度结构化的产品开发流程&#xff0c;它集成了业界很多优秀的产品开发方法论&#xff0c;像搭积木一样的组合成一种非常有效的流程。如果我们能根据企业的规模和行业特点&#xff0c;对全流程的IPD进行合适的裁剪…