MySQL 的 crash-safe浅谈

news2024/10/5 14:06:55

MySql执行流程
在这里插入图片描述
在这里插入图片描述

MySQL作为当下最流行的开源关系型数据库,有一个很关键和基本的能力,就是必须能够保证数据不会丢。那么在这个能力背后,MySQL是如何设计才能保证不管在什么时间崩溃,恢复后都能保证数据不会丢呢?有哪些关键技术支撑了这个能力;
MySQL 保证数据不会丢的能力主要体现在两方面:

  • 能够恢复到任何时间点的状态;
  • 能够保证MySQL在任何时间段突然奔溃,重启后之前提交的记录都不会丢失;
    对于第一点将MySQL恢复到任何时间点的状态,相信很多人都知道,只要保留有足够的binlog,就能通过重跑binlog来实现。
    对于第二点的能力,也就是本文标题所讲的crash-safe。即在 InnoDB 存储引擎中,事务提交过程中任何阶段,MySQL突然奔溃,重启后都能保证事务的完整性,已提交的数据不会丢失,未提交完整的数据会自动进行回滚。这个能力依赖的就是redo log和unod log两个日志。
    在这里插入图片描述
    因为crash-safe主要体现在事务执行过程中突然奔溃,重启后能保证事务完整性,所以在讲解具体原理之前,先了解下MySQL事务执行有哪些关键阶段,后面才能依据这几个阶段来进行解析。下面以一条更新语句的执行流程为例,话不多说,直接上图:

从上图可以清晰地看出一条更新语句在MySQL中是怎么执行的,简单进行总结一下:

  1. 从内存中找出这条数据记录,对其进行更新;
  2. 将对数据页的更改记录到redo log中;
  3. 将逻辑操作记录到binlog中;
  4. 对于内存中的数据和日志,都是由后台线程,当触发到落盘规则后再异步进行刷盘;

上面演示了一条更新语句的详细执行过程,接下来咱们通过解答问题,带着问题来剖析这个crash-safe的设计原理。

  • 问题:为什么不直接更改磁盘中的数据,而要在内存中更改,然后还需要写日志,最后再落盘这么复杂?
    这个问题相信很多同学都能猜出来,MySQL更改数据的时候,之所以不直接写磁盘文件中的数据,最主要就是性能问题。因为直接写磁盘文件是随机写,开销大性能低,没办法满足MySQL的性能要求。所以才会设计成先在内存中对数据进行更改,再异步落盘。但是内存总是不可靠,万一断电重启,还没来得及落盘的内存数据就会丢失,所以还需要加上写日志这个步骤,万一断电重启,还能通过日志中的记录进行恢复。
    二、WAL技术
    写日志虽然也是写磁盘,但是它是顺序写,相比随机写开销更小,能提升语句执行的性能(针对顺序写为什么比随机写更快,可以比喻为你有一个本子,按照顺序一页一页写肯定比写一个字都要找到对应页写快得多)。
    这个技术就是大多数存储系统基本都会用的WAL(Write Ahead Log)技术,也称为日志先行的技术,指的是对数据文件进行修改前,必须将修改先记录日志。保证了数据一致性和持久性,并且提升语句执行性能。
    核心日志
    ● 问题:更新SQL语句执行流程中,总共需要写3个日志,这3个是不是都需要,能不能进行简化?
    更新SQL执行过程中,总共涉及MySQL日志模块其中的三个核心日志,分别是redo log(重做日志)、undo log(回滚日志)、binlog(归档日志)。这里提前预告,crash-safe的能力主要依赖的就是这三大日志。
    接下来,针对每个日志将单独介绍各自的作用,然后再来评估是否能简化掉。
    三、核心日志模块

四、两阶段提交
五、组提交
六、数据恢复流程
七、总结

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

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

相关文章

在Win11的WSL子系统Ubuntu上安装Gnome桌面环境

目录 1. 使用 WSL 在 Win11 上安装 Linux 2. 安装Ubuntu 22.04默认Gnome桌面环境 2.1更新Ubuntu 22.04软件包 2.2 安装Ubuntu桌面环境 2.3 重启服务 2.4 重启Ubuntu 22.04系统 2.5 登录Gnome桌面环境 在Win11上安装ubuntu版linux系统并实现默认Gnome桌面环境&#xff08…

MySQL数据库(八)

目录 一、什么是索引 1.1索引的原理 1.2索引的优缺点 二、索引的使用 2.1查看索引 2.2手动创建索引 2.3删除索引 三、MySQL索引底层的数据结构 3.1 B树 3.2 B树 一、什么是索引 索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创…

深度理解 Spring AOP

一、什么是AOP(面向切面编程)?🍉 AOP 为 Aspect Oriented Programming 的缩写,意思为面向切面编程,是通过预编译方式 和运行期 动态代理 实现程序功能的统一维护的一种技术。 AOP (面向切面编程)是 OOP&a…

Jmeter 接口自动化和 Python 接口自动化,到底选哪个?

目录 前言: 背景 Jmeter 接口自动化 特点 Python 接口自动化 特点 谈项目 写在最后 前言: JMeter接口自动化和Python接口自动化都是常见的选择。 背景 很多刚接触接口自动化的朋友都会疑惑,市面上 Jmeter 接口自动化,Py…

题目2 文件上传(保姆级教程)

url:http://192.168.154.253:82/ #打开http://XXX:81/,XXX为靶机的ip地址 审题 1、打开题目看到有一个提示,此题目需要绕过WAF过滤规则,上传木马获取webshell,最后从根目录下key.php文件中获得flag 2、开始答题 第一步…

【数据结构】二叉树详解(3)

⭐️ 前言 ✨ 往期链接:【数据结构】二叉树详解(1) 在第一篇二叉树文章中,我们探讨了二叉树的链式结构定义与实现。二叉的遍历包含( 前序/中序/后序遍历 )及代码实现和递归流程图的详细讲解。还有一些二叉树的其他接口定义与实现,包含 Binar…

基于netlify生成custom SSL certificate

(1)腾讯云申请 (2)域名控制台解析 (3)Nginx下载(crt: CA certificate Chain)

C++ 设计模式 ---- 接口隔离模式

“接口隔离”模式 在组件构建过程中,某些接口之间直接的依赖常常会带来很多问题、甚至根本无法实现。采用添加一层间接(稳定)接口,来隔离本来互相紧密关联的接口是一种常见的解决方案。典型模式:1、Facade2、Proxy3、…

MongoDB原生语句更新嵌套数组的值

一、更新一层嵌套数组 首先执行MongoDB原生语句脚本在user集合中产生一些样本数据,如下所示: db.user.insert({"_id":1,"title":"爱情公寓3","students":[{"student_id":1001,"student_name":"林宛瑜&quo…

Docker介绍及安装使用

Docker介绍及安装使用 一、Docker的概述1、Docker是什么?2、Docker的Logo3、Docker的设计宗旨(一次封装,到处运行)4、容器化越来越受欢迎的原因 二、Docker与虚拟机的区别三、Docker的使用场景四、Docker的核心概念1、镜像2、容器…

基于linux下的高并发服务器开发(第二章)- 2.25 sigprocmask 函数使用

int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);- 功能:将自定义信号集中的数据设置到内核中(设置阻塞,解除阻塞,替换)- 参数:- how : 如何对内核阻塞信号集进行处理SIG_BLOCK: 将用户设…

【MySQl】MySQl中的乐观锁是怎么实现的

文章目录 前言一、乐观锁二、如何实现乐观锁呢,一般来说有以下2种方式2.1、使用数据版本(Version)记录机制实现2.2、乐观锁定的第二种实现方式和第一种差不多 前言 mysql中的乐观锁是怎么实现的?很多新手对此不是很清楚&#xff…

第一次参加【CSDN周赛(考试/编程竞赛)】第65期,应该注意些什么?都考什么题目?要具备什么知识?耗时__,我居然取得了__分的成绩

订阅专栏,学习更多干货知识!! 第一次参加 CSDN里的竞赛(考试),都需要注意些什么?考试都考了什么?要具备什么知识?本文带你了解一下!! 🤾🏿‍♂️目录 🌁一、先来看结果吧(有Bug?)🥕1.1 什么情况!🥕1.2 测评报告🥤1.2.1 选择题🥤1.2.2 编程题🥕1…

Redis持久化:分别启用rdb和aof,并查看是否有对应文件生成

一、rdb 简介:在指定的时间间隔内将内存中的数据集快照写入磁盘, 也就是Snapshot快照,它恢复时是将快照文件直接读到内存里。 1. 进入redis.conf文件中查看配置文件 [rootserver ~]# vim /usr/local/redis-stable/redis.conf 2.把持久化的…

《Docker数据管理:卷、挂载和持久化,保障容器环境数据安全》

🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~&#x1f33…

【博客682】k8s apiserver bookmarks机制以更高效检测变更

k8s apiserver bookmarks机制以更高效检测变更 list-watch背景: List-Watch 是kubernetes中server和client通信的最核心的机制, 比如说api-server监听etcd, kubelet监听api-server, scheduler监听api-server等等,其实…

Paragon NTFS2023最新版Mac读写NTFS磁盘工具

Paragon NTFS for Mac是Mac平台上一款非常优秀的读写工具,可以在Mac OS X中完全读写、修改、访问NTFS硬盘、U盘等外接设备的文件。这款软件最大的亮点简书可以让我们读写 NTFS 分区,因为在Mac OS X 系统上,默认状态下我们只能读取NTFS 分区&a…

152. 乘积最大子数组

152. 乘积最大子数组 原题链接:完成情况:解题思路:参考代码: 原题链接: 152. 乘积最大子数组 https://leetcode.cn/problems/maximum-product-subarray/ 完成情况: 解题思路: 看好题目&…

Nginx 301重定向分析

参考; 404 - 墨天轮 深度硬核文:Nginx的301重定向处理过程分析 - 知乎 Nginx的301状态码处理逻辑设计 HTTP协议中3xx开头的状态响应码都是表示重定向的响应。根据RFC的定义: 301 Moved Permanently 302 Found 303 See Other 307 Temporary Redirect 301是永…

STL——String类(2)成员函数详解

目录 前言 一.String的成员函数: 1.基本成员函数 代码实验: 实验结果: 类对象每次扩容后的capacity数据展示: 1.2. resize():调整字符串大小 1.3reserve():请求更改该对象的容量capacity值 代码实验…