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

news2024/9/20 22:47:19

 接上文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.coloradmin.cn/o/2043937.html

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

相关文章

Windows 10/11和Linux双系统用户请勿安装最新更新 否则将无法启动

据蓝点网报道,Windows 10/11 最新累积更新存在已知问题,如果你同时安装了 Linux 双系统则会在更新后导致系统无法正常启动。 启动时会出现如下报错: Verifiying shim SBAT data failed: Security Policy Violation.Something has gone serio…

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

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

win11笔记本电脑 声音输出设置为扬声器 | 添加蓝牙设备 | win11环境变量设置

🥇 版权: 本文由【墨理学AI】原创首发、各位读者大大、敬请查阅、感谢三连 🎉 声明: 作为全网 AI 领域 干货最多的博主之一,❤️ 不负光阴不负卿 ❤️ 文章目录 win11笔记本电脑 声音输出设置为扬声器搜索设置,打开设置选择声音选…

AI安全-文生图

1 需求 2 接口 3 示例 大模型图像安全风险探析 - 先知社区 前言 文生图模型是一种新兴的人工智能技术,它通过对大规模文本数据的学习,能够生成逼真的图像。这种模型包含两个主要组件:一个文本编码器和一个图像生成器。 文本编码器接收文本输入,并将其转换为一种数字化的表示…

Idea开发代码注释规范

规范 类注释:每个类都应该有一个简短的注释,描述这个类的用途和主要功能。注释应该放在类的声明之前,使用JavaDoc格式。 /*** 这是一个示例类,用于演示如何编写类注释。*/ public class ExampleClass {// ... }方法注释&#xf…

【Oracle点滴积累】解决PrereqSession failed: RawInventory gets null OracleHomeInfo故障的方法

广告位招租! 知识无价,人有情,无偿分享知识,希望本条信息对你有用! 今天和大家分享在安装Oracle Critical Patch Update (Patch Number:33806138) 遇到PrereqSession failed: RawInventory gets null OracleHomeInfo故…

github官网在线通过vscode编辑器模式查看编辑代码

文章目录 背景步骤关于快捷键话外 背景 今天新发现的一个小玩意儿 步骤 在github项目主页(我尝试了无痕模式不行) 按键盘的.这个按键,就是m右边2个,然后就会打开这个网站 github.dev/xxx 首次进入的时候,会像首次…

IDEA系列(四):IDEA导入Maven工程项目并配置Tomcat启动

IDEA系列(四):IDEA导入Maven工程项目并配置Tomcat启动 前言 【本篇使用IDEA版本:大概2020版本,较早了,不过版本大体一致】【若需要码,请扫描关注编程D艺术,回复idea2024,获取码使你的IDEA更加方…

Arm-v8/v9虚拟化原理---aarch64_virtualization_guide

一、相关参考(请仅参考,任意一篇足矣) 1.https://www.cnblogs.com/LoyenWang/p/13584020.html 2.https://zhuanlan.zhihu.com/p/470045640 3.万字剖析 Armv8 架构虚拟化-腾讯云开发者社区-腾讯云 4.https://zhuanlan.zhihu.com/p/5290842…

Docker——常用命令

1.Docker是做什么的? Docker 是一个开源的应用容器引擎,它让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。它可以帮助我们下载应用镜像,创建并运行镜…

SSM宠物领养系统-计算机毕设定制-附项目源码(可白嫖)55139

目 录 摘要 1 绪论 1.1 意义 1.2国内外研究现状 1.3ssm框架 1.4Vue.js 主要功能 1.4论文结构与章节安排 2 2 宠物领养系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据增加流程 2.2.2 数据修改流程 2.2.3数据删除流程 2.3 系统功能分析 2.3.1功能性分析…

泰坦尼克号 - 从灾难中学习机器学习/Titanic - Machine Learning from Disaster(kaggle竞赛)第一集(了解赛题)

此次目的: 准备出几期博客来记录我学习kaggle数据科学入门竞赛的过程,顺便也将其中所学习到的知识分享出来。这是第一集(了解赛题),后面还会更新更详尽的代码和讲解等。(所学主要的内容来自与b站大学恩师“…

从数据分析到智能生产:AI在工业中的应用与未来

导语 | 人工智能技术的迅猛发展,正在引领第四次工业革命悄然而至。尽管 AI 技术在工业领域的部署仍有诸多难题亟待解决,但这并不能阻挡历史趋势的车轮滚滚向前,AI 正在为工业领域带来新的变革。今天,我们特邀了上海腾展长融董事 &…

MybatisPlus使用指南

MybatisPlus 1. 快速入门1.1 入门案例1.2 常见注解1.3 常见配置 2. 核心功能2.1 条件构造器2.2 自定义SQL2.3 Service接口 3. 扩展功能3.1 代码生成3.2 静态工具3.3 逻辑删除 4. 插件功能4.1 分页插件4.2 通用分页实体 1. 快速入门 1.1 入门案例 步骤一:引入Mybat…

初阶数据结构排序之插入排序

排序01 插⼊排序 基本思想 直接插⼊排序是⼀种简单的插⼊排序法,其基本思想是:把待排序的记录按其关键码值的⼤⼩逐个插 ⼊到⼀个已经排好序的有序序列中,直到所有的记录插⼊完为⽌,得到⼀个新的有序序列 。 实际中我们玩扑克牌…

uniapp 日常业务 随便写写 源码

现成的组件 直接用 <template><view style"margin: 10rpx;"><view class"tea-header"><text class"tea-title">礼尚往来</text><view class"tea-view-all"><text>查看全部</text>&l…

Redis 如何实现高并发

Redis 如何实现高并发 1、架构概述2、读写分离的优势3、注意事项 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; Redis&#xff0c;作为一个高性能的键值对存储系统&#xff0c;通过其独特的设计和优化策略&#xff0c;能够有效地支持高并发…

关于TM611AWLCOR连续液位检测传感器的使用明细

1. 前言 本文只做软件协议相关的使用说明&#xff0c;对于硬件设计相关不做讨论。 本使用明细中涉及到的所有文档均来自诺泰官方技术支持并征得同意进行技术公开交流。其中涉及的代码均由我本人编写&#xff0c;仅供交流学习。 2. 数据手册 经由淘宝“青岛诺泰微电子有限公司”…

【添加与搜索单词 - 数据结构设计】python刷题记录

R4-位运算 Trie树BFS处理. class WordDictionary:def __init__(self):self.root{}def addWord(self, word: str) -> None:nodeself.rootfor c in word:if c not in node:node[c]{}nodenode[c]node["#"]{}def search(self, word: str) -> bool:word"#&quo…

MacOS上安装 Java

1.下载 oracle官网jdk下载地址 注意一下区分mac芯片版本&#xff0c;M1芯片选择Arm 64&#xff0c;Intel芯片选择x64 2.安装 傻瓜式安装&#xff0c;下载好后直接双击打开,一直下一步安装即可 3.查看安装路径 可通过以下命令查看安装路径(复制此输出路径&#xff0c;为后续…