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

news2024/11/18 7:44:19

基于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.coloradmin.cn/o/1476168.html

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

相关文章

springboot-基础-thymeleaf配置+YAML语法

备份笔记。所有代码都是2019年测试通过的,如有问题请自行搜索解决! 目录 配置thymeleafthymeleaf举例参数设置yaml基础知识YAML语法报错:Expecting a Mapping node but got 其他语法 spring boot不推荐使用jsp。thymeleaf是一个XML/XHTML/HTM…

算法沉淀——动态规划之回文串问题(上)(leetcode真题剖析)

算法沉淀——动态规划之回文串问题 01.回文子串02.最长回文子串03.分割回文串 IV04.分割回文串 II05.最长回文子序列06.让字符串成为回文串的最少插入次数 01.回文子串 题目链接:https://leetcode.cn/problems/palindromic-substrings/ 给你一个字符串 s &#xf…

SpringMVC 学习(九)之拦截器

目录 1 拦截器介绍 2 创建一个拦截器类 3 配置拦截器 1 拦截器介绍 在 SpringMVC 中,拦截器 (Interceptor) 是一种用于拦截 HTTP 请求并在请求处理之前或之后执行自定义逻辑的组件。拦截器可以用于实现以下功能: 权限验证:在请求处理之前…

python学习笔记-内置异常

概述 Python 中的异常(Exception)是指在程序执行过程中遇到的错误或异常情况。当程序出现异常时,解释器会停止当前代码的执行,并试图找到匹配的异常处理器来处理异常。如果没有找到合适的异常处理器,程序就会终止并打…

【MySQL】DCL

DCL英文全称是Data Control Language(数据控制语言),用来管理数据库用户、控制数据库的访问权限。 1. 管理用户 在MySQL数据库中,DCL(数据控制语言)是用来管理用户和权限的语句集合。通过DCL语句,可以创建、修改、删…

高性能Server的基石:reactor反应堆模式

业务开发同学只关心业务处理流程。但是我们开发的程序都是运行服务端server上,服务端server接收到IO请求后,是如何处理请求并最终进入业务流程的呢?这里不得不提到reactor反应堆模型。reactor反应堆模型来源于大师Doug Lea在 《Sacalable io …

基于51单片机烟雾报警器数码管显示( proteus仿真+程序+设计报告+讲解视频)

基于51单片机烟雾报警器数码管显示( proteus仿真程序设计报告讲解视频) 仿真图proteus7.8及以上 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0067 1. 主要功能: 基于51单片机的烟雾报警器proteus仿真设…

AxureCloud配置文件详细介绍

AxureCloud配置文件详细介绍 原文地址:https://docs.axure.com/axure-cloud/business/custom-settings-json/ 通过修改 customsettings.json 可以修改AxureCloud私有部署的域名、端口、HTTPS、存储目录、是否开启插件等, 默认安装的路径为: C:\Program Files\Axure…

milvus Upsert api数据结构源码分析

Upsert api数据结构 该方法将实体更新插入到 Milvus 中。如果集合中已存在指定字段,则该操作将覆盖现有实体;如果指定值尚不存在,则插入新实体。 实现:先insert再delete,并限制不能修改主键列。 限制:主键的autoid必须是false。…

【JS逆向学习】猿人学 第三题 罗生门

逆向目标 网址: 目标:session请求 逆向分析 首先分析网络请求,我们发现每次的翻页请求都会有一个jssm请求 从启动器进去跟栈进去 现在观察一下cookie是否有变化,经观察没有发生变化,参数也没有加密,所…

Python打发无聊时光:10.用flask创造按键控制的网页小游戏

第一步:装flask库 在终端输入: pip install flask 第二步:完整代码 为了方便大家移植,我将HTML、CSS和JavaScript直接嵌到一个py文件中。 from flask import Flask, render_template_stringapp Flask(__name__)app.route(/) def game()…

智能水表预付费管理系统

智能水表预付费管理系统是当前智能水表技术的重要应用之一,结合了智能化管理和预付费功能,为水务公司和用户提供了便捷、高效的用水管理解决方案。该系统利用先进的科技手段,实现了水表抄表、计费和管理的自动化,为用户带来更便捷…

如何删除右键菜单中的WPS与百度网盘

WPS 打开"开始菜单" ,搜索WPS,打开文件位置双击 WPS Office 工具选择配置工具 百度网盘 同时按住 Win键 和 R键 在运行中输入 regedit 打开注册表 复制粘贴,转到下面两个文件,直接删除即可 计算机\HKEY_CLASSES…

nginx实现http反向代理及负载均衡

目录 一、代理概述 1、代理概念 1.1 正向代理(Forward Proxy) 1.2 反向代理(Reverse Proxy) 1.3 正向代理与反向代理的区别 2、同构代理与异构代理 2.1 同构代理 2.2 异构代理 2.3 同构代理与异构代理的区别 二、四层代…

设计模式(五)-观察者模式

前言 实际业务开发过程中,业务逻辑可能非常复杂,核心业务 N 个子业务。如果都放到一块儿去做,代码可能会很长,耦合度不断攀升,维护起来也麻烦,甚至头疼。还有一些业务场景不需要在一次请求中同步完成&…

计讯物联5G RedCap网关TG463化繁为简,推动5G赋能千行百业

5G RedCap,全称为Reduced Capability,即在5G的基础上,对部分功能进行化繁为简后形成的新技术标准,故又称轻量化5G。作为高性价比下的精简技术,5G RedCap技术具备成本低、低功耗、兼顾5G等特点,能够在确保应…

小程序--组件通信

一、父传子 与vue利用props类似,小程序是利用自定义属性:properties // components/my-nav/my-nav.js Component({// 小程序组件默认样式是隔离,addGlobalClass设置为true可允许外部修改样式options: {addGlobalClass: true,// 只要使用到具…

express+mysql+vue,从零搭建一个商城管理系统4--mysql数据库链接

提示:学习express,搭建管理系统 文章目录 前言一、创建express_service数据库二、安装mysql三、新建config文件夹四、新建config/db.js五、index.js引入db.js文件六、启动项目预览总结 前言 需求:主要学习express,所以先写service…

MarkDown实用技巧:MarkDown中如何实现换行?

MarkDown实用技巧:MarkDown中如何实现换行? 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程 👈 希望…

YOLOv8改进 | 独家创新篇 | 结合SOTA思想利用双主干网络改进YOLOv8(全网独家创新,最重磅的更新)

一、本文介绍 本文给大家带来的改进机制是结合目前SOTAYOLOv9的思想利用双主干网络来改进YOLOv8(本专栏目前发布以来改进最大的内容,同时本文内容为我个人一手整理全网独家首发 | 就连V9官方不支持的模型宽度和深度修改我都均已提供,本文内容支持YOLOv8全系列模型从n到x均可…