MySQL InnoDB中一个update语句从执行到提交的全过程(3)

 接上文MySQL InnoDB中一个update语句从执行到提交的全过程(2)-CSDN博客

目录

六、本地提交

怎样保证binlog和redo log的状态一致呢?

MySQL 中的内部 XA 机制

宕机时不同状态的处理

物理落盘策略

七、主备复制

八、返回提交成功

总结一下

九、脏页刷入磁盘

​编辑


六、本地提交

修改完成之后,还有一个至关重要的步骤,那就是commit。只有完成commit,这个update才能真正地持久化下来,不会因为MySQL的任何故障而丢失。

对于Innodb存储引擎而言,提交过程真正需要写入的只有redolog。

Innodb存储引擎中,redolog落盘的步骤是什么?

redo日志文件的结构

  • MySQL 8.0.30之前,redo日志文件默认有两个:ib_logfile0和ib_logfile1,两个日志
  • 文件会进行交替的写入;
  • MySQL 8.0.30,对redo log进行了重构,允许了redo log空间的动态修改。

提交阶段InnoDB存储引擎要落盘redo log,MySQL服务器层要落盘binlog(binlog在之前的事务执行阶段就会生成)。

怎样保证binlog和redo log的状态一致呢?

MySQL 中的内部 XA 机制

MySQL采用了一种内部XA事务的机制保证binlog和redolog的状态和顺序都一致,其核心是我们在分布式领域耳熟能详的两阶段提交(2PC),具体过程如下:

  • prepare阶段:InnoDB刷redo log到磁盘,redo log落盘完成后,修改事务状态为TRX_PREPARED。

    • prepare如果失败,那么事务会回滚;而prepare成功后,就进入两阶段提交的commit阶段。

  • commit阶段:MySQL 服务器层会首先将 Binlog 写入磁盘,写入完成后,修改事务状态为TRX_NOT_STARTE。事务的提交就算成功了。

宕机时不同状态的处理
  • 事务状态为TRX_ACTIVE,那么直接回滚事务;
  • 事务状态为TRX_NOT_STARTED,表示事务的redo log和binlog都已落盘,认为事务已经提交;
  • 恢复时如果发现一个事务状态为TRX_PREPARED,根据binlog的写入状态来判断提交还是回滚:
    • 如果binlog没写入成功,则回滚
    • 如果binlog写入成功,则提交并修改事务状态为TRX_NOT_STARTED

通过这种方式,MySQL 能够确保在系统崩溃的情况下,Binlog 和 Redo Log 保持一致性,即不会出现 Binlog 已记录但 Redo Log 未提交的情况,或反之亦然。这种一致性保证对于基于 Binlog 的主从复制和 Point-in-Time 恢复非常关键。

物理落盘策略

只不过上面提到的都是逻辑上,实际是否把日志写入磁盘,与物理落盘策略有关,由下面俩参数控制:

  • nnodb_flush_log_at_trx_commit:控制redo log的落盘,可选值为0,1,2。
    • 0表示每秒进行一次刷新
    • 1表示每次事务提交都会落盘
    • 2表示每次事务提交会把redo log缓冲写入操作系统缓冲,每秒刷盘
  • sync_binlog:控制binlog的落盘,可选值为0,1。
    • 0表示每次提交事务,不刷binlog
    • 1表示每次提交事务,都会立刻写binlog到磁盘
  • MySQL 8.0默认都设置为1。

这样,我们的SQL就在当前MySQL服务器上提交完成了。

七、主备复制

但在很多场景下,这并不意味着我们直接可以返回客户端提交成功了,如果配置了主从复制,还需要根据我们的同步策略来判定是否符合提交成功的条件。

主从复制的策略

  • 异步复制:主库写完binlog后即可返回提交成功,无需等待备库响应
  • 半同步复制:主库接收到指定数量的备机转储relay log成功的ACK后可返回提交成功;
  • 同步复制:主库等到备库回放relaylog执行完事务之后才可返回提交成功。

因为半同步复制兼具了高可用性和性能,所以我们通常都会选择半同步复制的策略。

假设我们这条SQL是发往一个一主两备的MySQL集群,配置的备机响应数=1,那么主库接收到一个备库转储relaylog成功的响应后,即可返回提交成功。

此时,如果备机一直没有响应怎么办?难不成一直等下去?Mysql原生的半同步复制策略有一个超时时间,超过这个时间还没有备机响应的话,主机就自动提交了。显然这是很不安全的,因为这种情况下半同步复制退化成了异步复制策略。所以很多开源工具和基于MySQL的分布式数据库都在这里进行了一些改造。

八、返回提交成功

到这里,客户端收到了提交成功的反馈,可以认为整个事务已经结束了,修改命令已经执行完成,并且持久化在了我们的MySQL数据库中。

总结一下

(1)首先,任何sql都要在事务中执行,所以我们的第一步就是开启事务,但不会在这里就分配事务号。接下来update sql就发往mysql服务器层,这时我们分配的T024这个事务号。

(2)然后经过了sql解析、词法分析、语法分析。查询优化等步骤,最终生成一个物理执行计划,通过这个物理执行计划,mysql执行器开始调用Innodb存储引擎的接口进行后面的修改操作。

(3)修改这项数据之前把它查出来,我们先根据根节点的页号获取到B+树的根节点,然后解析根节点这个索引页,通过其中的条件比较找到下一层节点页号,重复这个过程,直至找到叶子节点,解析数据页,从而获取到我们想要的数据。

这个过程中的所有页要么一开始就在buffer pool中,要么从磁盘加载到buffer pool中。

(4)然后我们要对这样数据进行校验锁和加锁。这里会上三个锁,分别是mysql服务器层的元数据锁,Innodb存储引擎层的表级意向IX锁和行级排他X锁。加上锁后,我们就可以对数据进行修改。

(5)这个过程需要在InnoDB存储引擎写入数据页、undolog和redolog,在MySQL服务器层写入binlog。所有的这些在这一步都不用落盘。

(6)修改和生成日志完成后,就可以开始提交了。

主机提交需要redolog和binlog落盘。这里,通过MySQL内部XA事务机制来协调redolog和binlog,保证两个日志的状态一致。

(7)如果配置了主备复制,那么还需要把binlog同步给备机。在最常用的半同复制模式下,有指定数量的备机转储返回成功后即可返回提交成功。如果超过超时时间还没达到指定数量的反馈,则会退化成异步复制,主机直接返回提交成功。

(8)至此,从客户端的角度来说,这个事务提交成功了。

九、脏页刷入磁盘

但在数据库内部的概念里,我们修改后的数据已经还没落盘。

看一下MySQL把脏页落盘的过程。

想象一下MySQL落盘的操作,要把这个16K的页刷到磁盘中的一块区域中,但这里有一个风险。

如果我们写这个页的时候,比如说只写了4K,系统就发生了宕机,这个时候的异常状态怎么处理呢?大家可能第一时间会想到用redolog来恢复,但我们已经解读过redolog的结构。redolog记录页物理结构所做的变更。是一个基于完整且正确,只是老版本的页了。现在我们在磁盘中的页已经被破坏,是不完整的。所以redolog也没法很好的恢复。

这个时候应该怎么处理呢?

MySQL针对这种情况设计了两次写(double write)机制,其实原理很简单,就是先把脏页都复制到doublewrite buffer中,然后doublewrite buffer先落盘,而后脏页再真正落盘。

这样如果发生了宕机恢复时,doublewrite buffer中的页覆盖磁盘中的页,再进一步用redolog恢复,这样就能确保页是完整的,解决了我们的问题。

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

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

相关文章

目标检测之数据增强

一、概述 数据增强是一种通过人工或自动方式对数据进行修改或变换,以增加数据集规模和多样性的技术。在机器学习中,数据增强被广泛应用于解决数据稀缺、数据不平衡、数据噪声等问题,提高模型的泛化能力和鲁棒性。 二、为什么需要数据增强 …

吃透前端文件上传与文件相关操作 多文件上传 大文件切片上传 拖拽上传 后续还会更新 断点续传等等

最近在学文件上传的操作,所以想把学习到东西写成一文章 这片文章是我以小白视角 慢慢学习并熟悉前端文件相关操作的流程总结出来的 前端文件上传 我首先想到是 <input type"file">**选择文件**</input>如果我们想限制上传文件的格式,大小或进行裁剪分片…

【Python快速入门和实践016】Python常用脚本-对视频抽取指定帧数并保存

一、功能介绍 这段代码的功能是从一个视频文件中抽取指定数量的帧&#xff0c;并将这些帧保存为图像文件。步骤如下&#xff1a; 设置路径和参数&#xff1a; video_path&#xff1a;视频文件的路径。image_folder&#xff1a;保存抽取图像的目录。num_frames_to_extract&#…

达梦数据库系列—49.审计功能

目录 1、打开审计 2、审计级别 系统级审计 语句级审计 对象级审计 3、审计文件管理 删除审计文件 查看审计信息 4、审计分析 审计分析工具Analyzer 审计分析工具dmaudtool 1、打开审计 0&#xff1a;关闭审计1&#xff1a;打开普通审计2&#xff1a;打开普通审计和…

Linux 进程间通信之管道

个人主页&#xff1a;仍有未知等待探索-CSDN博客 专题分栏&#xff1a; Linux 目录 一、通信 1、进程为什么要通信&#xff1f; 1.数据的类型 2.父进程和子进程算通信吗&#xff1f; 2、进程如何通信&#xff1f; 3、进程通信的常见方式&#xff1f; 二、管道 1、概念…

Java家教一对一系统小程序源码

&#x1f31f;【家教新风尚&#xff0c;一对一系统引领学习革命】&#x1f31f; &#x1f4da; 个性化定制&#xff0c;学习更高效 你还在为孩子的学习成绩提升缓慢而烦恼吗&#xff1f;家教一对一系统&#xff0c;正是解决这一难题的钥匙&#xff01;它根据孩子的年龄、兴趣…

动手学深度学习(pytorch)学习记录12-激活函数[学习记录]

激活函数 激活函数&#xff08;activation function&#xff09;通过计算加权和并加上偏置来确定神经元是否应该被激活&#xff0c; 它们将输入信号转换为输出的可微运算。 import torch import matplotlib.pyplot as plt 简单定义一个画图的函数 def graph_drawing(x_,y_…

static、extern,const关键字

1、static关键字 static关键字&#xff1a;延长生命周期&#xff0c;限制作用域 static修饰局部变量&#xff1a;静态局部变量 static修饰全局变量&#xff1a;静态全局变量 static修饰函数&#xff1a;静态函数 2、extern关键字 extern&#xff1a;引用其他文件 .c 中的全局…

私域场景中的数字化营销秘诀

​在当今的商业世界&#xff0c;私域场景的营销变得愈发重要。今天咱们就来深入探讨一下私域场景中的几个关键营销手段。 一、会员管理与营销 企业一旦拥有完善的会员体系&#xff0c;数字化手段就能大放异彩。它可以助力企业对会员进行精细划分&#xff0c;深度了解会员的消费…

STM32 GPIO 模块

B站视频地址&#xff1a;芯片内部GPIO模块细节 引脚 将 STM32 芯片&#xff0c;类比为【大脑】 而旁边的引脚&#xff0c;类比为【神经】 通过引脚&#xff0c;使得&#xff0c;STM32&#xff0c;可以和外部世界&#xff0c;进行交流 比如&#xff0c;当我们和别人说话时&am…

【安全工具推荐-Search_Viewer资产测绘】

目录 一、工具介绍 二、工具配置 三、传送门 一、工具介绍 Search_Viewer&#xff0c;集Fofa、Hunter鹰图、Shodan、360 quake、Zoomeye 钟馗之眼、censys 为一体的空间测绘gui图形界面化工具&#xff0c;支持一键采集爬取和导出fofa、shodan等数据&#xff0c;方便快捷查看…

基于808协议和1078协议的视频监控系统

卫星定位云服务平台 卫星定位云服务平台是一个车载视频终端监控系统,用于对卫星定位设备进行实时监控、实时定位、轨迹回放、指令下发、拍照记录、报警信息、实时视频、历史视频等功能。808协议和1078协议 内置功能 车队管理&#xff1a;车队信息的增删改查。型号管理&#…

快速MD5强碰撞生成器:fastcoll

问&#xff1a;可以制作两个具有相同哈希值的不同文件吗&#xff1f; 答&#xff1a;可以。 在密码学中&#xff0c;哈希函数将输入数据转换成固定长度的字符串。但由于输入的无限性和输出的固定性&#xff0c;不可避免地会有不同输入产生相同的哈希值&#xff0c;这就是碰撞。…

力扣面试经典算法150题:找出字符串中第一个匹配项的下标

找出字符串中第一个匹配项的下标 今天的题目是力扣面试经典150题中的数组的简单题: 找出字符串中第一个匹配项的下标 题目链接&#xff1a;https://leetcode.cn/problems/find-the-index-of-the-first-occurrence-in-a-string/description/?envTypestudy-plan-v2&envIdto…

短视频SDK解决方案,降低行业开发门槛

美摄科技匠心打造了一款集前沿技术与极致体验于一体的短视频SDK解决方案&#xff0c;它不仅重新定义了短视频创作的边界&#xff0c;更以行业标杆级的短视频特效&#xff0c;让每一帧画面都闪耀不凡光芒。 【技术赋能&#xff0c;创意无限】 美摄科技的短视频SDK&#xff0c;…

基于DVWA-Brute Force(LowMedium)的渗透测试

Brute force主要是通过爆破达到渗透目的&#xff1a; Low 查看源代码&#xff1a; <?phpif( isset( $_GET[ Login ] ) ) {// Get username$user $_GET[ username ];// Get password$pass $_GET[ password ];$pass md5( $pass );// Check the database$query "SE…

遗传算法与深度学习实战(4)——遗传算法详解与实现

遗传算法与深度学习实战&#xff08;4&#xff09;——遗传算法详解与实现 0. 前言1. 遗传算法简介1.1 遗传学和减数分裂1.2 类比达尔文进化论 2. 遗传算法的基本流程2.1 创建初始种群2.2 计算适应度2.3 选择、交叉和变异2.4算法终止条件 3. 使用 Python 实现遗传算法3.1 构建种…

Adobe Audition AU 2023-23.6.6.1 解锁版下载和安装教程(专业的音频处理工具)

前言 Audition是Adobe旗下一款非常好用的音频处理工具&#xff0c;软件为用户们提供了功能强大的音频编辑功能和一个相对完善的工作流程&#xff0c;用户们无论是录制音乐、无线电广播还是视频配音&#xff0c;多音频合成&#xff0c;这款软件都能够给你足够的创作动力。audit…

7za解压缩工具

1、unzip无法解压缩大于4G的文件 从Windows平台通过MobaXterm上传一个大小约为5G的zip文件到AutoDL Linux系统上&#xff0c;使用unzip解压过程中出现如下错误&#xff1a; 从网上搜索了一下相关资料&#xff0c;发现是当前的unzip版本不支持4G以上的压缩包。要么升级到最新…

贪吃蛇(C语言详解)

贪吃蛇游戏运行画面-CSDN直播 目录 贪吃蛇游戏运行画面-CSDN直播 1. 实验目标 2. Win32 API介绍 2.1 Win32 API 2.2 控制台程序&#xff08;Console&#xff09; 2.3 控制台屏幕上的坐标COORD 2.4 GetStdHandle 2.5 GetConsoleCursorlnfo 2.5.1 CONSOLE_CURSOR_INFO …