0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一条SQL更新语句的执行流程2

jf_78858299 来源:蝉沐风的码场 作者: 蝉沐风 2023-03-03 10:02 613次阅读

3.3 redo日志的系统变量

redo日志位于MySQL数据目录下,默认有ib_logfile0ib_logfile1两个文件,如下图所示。

图片

可以发现,两个redo日志文件的大小都是50331648,默认48MB。为什么这个大小是固定的呢?因为如果我们要使用顺序I/O,就必须在申请磁盘空间的时候一次性决定申请的空间大小,这样才能保证申请的磁盘空间在地址上的连续性。

这也就决定了redo日志的旧数据会被覆盖,一旦文件被写满,就会触发Buffer Pool脏页到磁盘的同步,以腾出额外空间记录后面的修改。

可以通过以下指令查看redo日志的系统属性。

mysql> show variables like 'innodb_log%';
+-----------------------------+----------+
| Variable_name               | Value    |
+-----------------------------+----------+
| innodb_log_buffer_size      | 16777216 |
| innodb_log_checksums        | ON       |
| innodb_log_compressed_pages | ON       |
| innodb_log_file_size        | 50331648 |
| innodb_log_files_in_group   | 2        |
| innodb_log_group_home_dir   | ./       |
| innodb_log_write_ahead_size | 8192     |
+-----------------------------+----------+
参数名称 含义
innodb_log_file_size 指定每个redo日志文件的大小,默认48MB
innodb_log_files_in_group 指定redo日志文件的数量,默认2
innodb_log_group_home_dir 指定redo文件的路径,如果不指定,则默认为datadir目录

介绍到这里,读者朋友可以发现,我们刚才探索的是如何让已经提交的事务保持持久化,但是如果某些事务偏偏在执行到一半的时候出现问题怎么办?

事务的原子性要求事务中的所有操作要么都成功,要么都失败,不允许存在中间状态。就好比我在写这篇文章的时候,会时不时地敲一下ctrl+Z返回到上一步或者过去好几步之前的状态,MySQL也需要“留一手”,把事务回滚时需要的东西都记录下来。

比如,插入数据的时候,至少应该把新增的这条记录的主键的值记录下来,这样回滚的时候只要把这个主键值对应的记录删除就可以了。

MySQL又一个鼎鼎大名的日志—— undo日志 ,正式登场!

4. undo日志

undo log(撤销日志或回滚日志)记录了事务发生之前的数据状态,分为insert undo log和update undo log。

如果修改数据时出现异常,可以用 undo log来实现回滚操作(保持原子性)。可以理解为undo日志记录的是反向的操作,比如INSERT操作会记录DELETE,UPDATE会记录UPDATE之前的值,和redo日志记录在哪个物理页面做了什么操作不同,所以这是一种逻辑格式的日志。

undo日志和redo日志与事务密切相关,被统称为「事务日志」。

图片

关于undo日志,我们目前只需要了解这么多即可

5. SQL更新语句的执行总结——初版

有了事务日志之后,我们来简单总结一下更新操作的流程,这是一个简化的过程。

name 原值是chanmufeng

update t_user_innodb set name ='chanmufeng1994' where id = 1;
  1. 事务开始,从内存(Buffer Pool)或磁盘取到包含这条数据的数据页,返回给 Server 的执行器;
  2. Server 的执行器修改数据页的这一行数据的值为 chanmufeng1994;
  3. 记录 name=chanmufeng 到undo log;
  4. 记录 name=chanmufeng1994到redo log;
  5. 调用存储引擎接口,记录数据页到Buffer Pool(修改 name=penyuyan);
  6. 事务提交。

6. binlog日志

之前我们讲过,从MySQL整体架构来看,其实可以分成两部分

  • Server 层,它主要做的是 MySQL功能层面的事情,比如处理连接、解析优化等;
  • 存储引擎层,负责存储相关的具体事宜。

redo日志是InnoDB存储引擎特有的日志,而Server层也有自己的日志,称为 binlog(归档日志),它可以被所有存储引擎使用。

6.1 为什么有了redo日志还需要 binlog?

我想你可能会问出这个问题,实际上,更准确的问法是为什么有了binlog还需要有redo日志?主要有以下几个原因。

  1. 因为最开始MySQL里并没有InnoDB存储引擎。MySQL自带的引擎是MyISAM,但是 MyISAM没有崩溃恢复的能力,InnoDB后来以插件的形式被引入,顺便带来了redo日志;
  2. binlog日志是用来归档的,binlog以事件的形式记录了所有的 DDL和 DML 语句(因为它记录的是操作而不是 数据值,属于逻辑日志),但是不具备宕机恢复的功能,因为可能没有来得及刷新脏页,造成脏页数据的丢失,而这些操作也没有保存到binlog中从而造成数据丢失;
  3. binlog记录的是关于一个事务的具体操作内容,即该日志是逻辑日志。而redo日志记录的是关于每个页的更改的物理情况。功能压根不是一回事儿。

6.2 binlog日志的作用

6.2.1 主从复制

binlog是实现MySQL主从复制功能的核心组件。

master节点会将所有的写操作记录到binlog中,slave节点会有专门的I/O线程读取master节点的binlog,将写操作同步到当前所在的slave节点。

图片

6.2.2 数据恢复

假如你在阅读这篇文章的时候觉得我写得实在太好,拍案叫绝的时候一不小心把公司的数据库给删了,你该怎么做才能恢复到你删库之前的那个时刻的状态?

这个时候就要用到binlog了,前提是binlog没有被删除,否则,神仙也救不了你了。

通常情况下,公司会定期对数据库进行全量备份,可能隔一个月,一周,甚至可能每天都备份一次。运气好的话你可以使用前一天的全量备份,恢复到前一天的某时刻状态(或者一周、一月之前),然后从全量备份的时刻开始,从binlog中提取该时刻之后(前提是你的binlog里面存放了这段时间的日志)的所有写操作(当然,你得过滤掉你的删库操作),然后进行操作回放就可以了。

是不是很简单?

问题又来了。再看一眼我们的更新语句。

update t_user_innodb set name ='chanmufeng1994' where id = 1;

假如这条更新语句已经被写入到了redo日志,还没来得及写binlog的时候,MySQL宕机重启了,我们看一下会发生什么。

因为redo日志可以在重启的时候用于恢复数据,所以写入磁盘的是chanmufeng1994。但是binlog里面没有记录这个逻辑日志,所以这时候用binlog去恢复数据或者同步到从库,就会出现数据不一致的情况。

所以在写两个日志的情况下,就类似于「分布式事务」的情况,如果你不清楚分布式事务是个什么东西也没关系,我在之后的文章会介绍到。能够明确的就是redo日志和binlog日志如果单纯依次进行提交是无法保证两种日志都写成功或者都写失败的。

我们需要「两阶段提交」。

6.3 两阶段提交

两阶段提交不是MySQL的专利,两阶段提交是一种跨系统维持数据逻辑一致性的常见方案,尤其在分布式事务上,所以请读者重点体会思想

我们把redo日志的提交分成两步,两步中redo日志的状态分别是preparecommit。步骤如下

  1. InnoDB存储引擎将更改更新到内存中后,同时将这个更新操作记录到redo日志里面,此时redo日志处于prepare状态;
  2. 执行器生成这个操作的binlog,并将binlog刷盘;
  3. 执行器调用InnoDB的提交事务接口,InnoDB把刚刚写入的redo日志改成commit状态。至此,所有操作完成。

图片

加上两阶段提交之后我们再来看一下SQL更新语句的执行流程。

7. SQL更新语句的执行总结——终版

图片

  1. 客户端发送更新命令到MySQL服务器,经过处理连接、解析优化等步骤;
  2. Server层向InnoDB存储引擎要id=1的这条记录;
  3. 存储引擎先从缓存中查找这条记录,有的话直接返回,没有则从磁盘加载到缓存中然后返回;
  4. Server层执行器修改这条记录的name字段值;
  5. 存储引擎更新修改到内存中;
  6. 存储引擎记录redo日志,并将状态设置为prepare状态;
  7. 存储引擎通知执行器,修改完毕,可以进行事务提交;
  8. Server先写了个binlog;
  9. Server提交事务;
  10. 存储引擎将redo日志中和当前事务相关的记录状态设置为commit状态。

完!

参考资料

  1. MySQL实战45讲
  2. MySQL是怎样运行的
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 存储
    +关注

    关注

    13

    文章

    4472

    浏览量

    86922
  • buffer
    +关注

    关注

    2

    文章

    120

    浏览量

    30411
  • MySQL
    +关注

    关注

    1

    文章

    840

    浏览量

    27361
收藏 人收藏
    相关推荐
    热点推荐

    STM8L执行一条语句大概需要几个时钟周期?

    STM8L执行一条语句大概需要几个时钟周期
    发表于 05-06 06:16

    DSP执行一条语句的时间

    CPU配置成150M。高频时钟75M。 那么执行一条语句的时间是多少呢
    发表于 10-15 11:28

    为什么要动态sql语句

    为什么要动态sql语句?因为动态sql语句能够提供些比较友好的机制1、可以使得些在编译过程中
    发表于 12-20 06:00

    MySQL存储引擎完成更新语句执行的方法

    首先肯定是我们的系统通过个数据库连接发送到了MySQL上,然后肯定会经过SQL接口、解析器、优化器、执行器几个环节,解析SQL语句,生成
    的头像 发表于 10-21 10:40 2176次阅读
    MySQL存储引擎完成<b class='flag-5'>更新语句</b><b class='flag-5'>执行</b>的方法

    select语句和update语句分别是怎么执行

    样,但是具体的实现还是有区别的。 当然深入了解select和update的具体区别并不是只为了面试,当希望Mysql能够高效的执行的时候,最好的办法就是清楚的了解Mysql是如何执行查询的,只有更加全面的了解
    的头像 发表于 11-03 09:41 3733次阅读
    select<b class='flag-5'>语句</b>和update<b class='flag-5'>语句</b>分别是怎么<b class='flag-5'>执行</b>的

    一条SQL语句是怎么被执行

    直是想知道一条SQL语句是怎么被执行的,它执行的顺序是怎样的,然后查看总结各方资料,就有了下面
    的头像 发表于 09-12 09:44 1646次阅读
    <b class='flag-5'>一条</b><b class='flag-5'>SQL</b><b class='flag-5'>语句</b>是怎么被<b class='flag-5'>执行</b>的

    简述SQL更新语句执行流程1

    之前我们讲过了一条SQL查询语句是如何执行的,那么插入(INSERT)、更新(UPDATE)和删除(DELETE)操作的
    的头像 发表于 02-14 15:40 742次阅读
    简述<b class='flag-5'>SQL</b><b class='flag-5'>更新语句</b>的<b class='flag-5'>执行</b><b class='flag-5'>流程</b>1

    简述SQL更新语句执行流程2

    之前我们讲过了一条SQL查询语句是如何执行的,那么插入(INSERT)、更新(UPDATE)和删除(DELETE)操作的
    的头像 发表于 02-14 15:40 656次阅读
    简述<b class='flag-5'>SQL</b><b class='flag-5'>更新语句</b>的<b class='flag-5'>执行</b><b class='flag-5'>流程</b><b class='flag-5'>2</b>

    一条SQL查询语句是怎么去执行的?(上)

    MySQL是典型的`C/S架构`(客户端/服务器架构),客户端进程向服务端进程发送段文本(MySQL指令),服务器进程进行语句处理然后返回执行结果。
    的头像 发表于 03-03 09:58 511次阅读
    <b class='flag-5'>一条</b><b class='flag-5'>SQL</b>查询<b class='flag-5'>语句</b>是怎么去<b class='flag-5'>执行</b>的?(上)

    一条SQL查询语句是怎么去执行的?(中)

    MySQL是典型的`C/S架构`(客户端/服务器架构),客户端进程向服务端进程发送段文本(MySQL指令),服务器进程进行语句处理然后返回执行结果。
    的头像 发表于 03-03 09:58 559次阅读
    <b class='flag-5'>一条</b><b class='flag-5'>SQL</b>查询<b class='flag-5'>语句</b>是怎么去<b class='flag-5'>执行</b>的?(中)

    一条SQL查询语句是怎么去执行的?(下)

    MySQL是典型的`C/S架构`(客户端/服务器架构),客户端进程向服务端进程发送段文本(MySQL指令),服务器进程进行语句处理然后返回执行结果。
    的头像 发表于 03-03 09:58 516次阅读
    <b class='flag-5'>一条</b><b class='flag-5'>SQL</b>查询<b class='flag-5'>语句</b>是怎么去<b class='flag-5'>执行</b>的?(下)

    一条SQL更新语句执行流程1

    什么是InnoDB页?缓存页又是什么?为什么这么设计? * 什么是表空间?不同存储引擎的表在文件系统的底层表示上有什么区别? * Buffer Pool是什么?为什么需要?有哪些我们需要掌握的细节? * MySQL
    的头像 发表于 03-03 10:02 775次阅读
    <b class='flag-5'>一条</b><b class='flag-5'>SQL</b><b class='flag-5'>更新语句</b>的<b class='flag-5'>执行</b><b class='flag-5'>流程</b>1

    sql where条件的执行顺序

    。 在深入讨论WHERE条件的执行顺序之前,先回顾一下一SQL语句执行顺序。一条
    的头像 发表于 11-23 11:31 2520次阅读

    oracle执行sql查询语句的步骤是什么

    Oracle数据库是种常用的关系型数据库管理系统,具有强大的SQL查询功能。Oracle执行SQL查询语句的步骤包括编写
    的头像 发表于 12-06 10:49 1217次阅读

    单片机中for语句的运用

    语句,它的基本结构如下: for (初始化语句; 条件表达式; 更新语句) {循环体;} for语句执行
    的头像 发表于 01-05 14:02 2991次阅读

    硬件原理图学习笔记

    这一个星期认真学习了硬件原理图的知识,做了一些笔记,方便以后查找。硬件原理图分为三类1.管脚类(gpio)和门电路类输入输出引脚,上拉电阻,三极管与门,或门,非门上拉电阻:正向标志作用,给悬空的引脚一个确定的状态三极管:反向三极管(gpio输出高电平,NP两端导通,被控制端导通,电压为0)->NPN正向三极管(gpio输出低电平,PN两端导通,被控制端导通,

    张飞实战电子官方
    04-30 18:40
    159

    TurMass™ vs LoRa:无线通讯模块的革命性突破

    TurMass™凭借其高传输速率、强大并发能力、双向传输、超强抗干扰能力、超远传输距离、全国产技术、灵活组网方案以及便捷开发等八大优势,在无线通讯领域展现出强大的竞争力。

    道生物联
    9小时前
    285

    RZT2H CR52双核BOOT流程和例程代码分析

    RZT2H是多核处理器,启动时,需要一个“主核”先启动,然后主核根据规则,加载和启动其他内核。本文以T2H内部的CR52双核为例,说明T2H多核启动流程。

    RA生态工作室
    04-03 17:14
    1.9k

    干簧继电器在RF信号衰减中的应用与优势

    在电子测试领域,RF(射频)评估是不可或缺的一部分。无论是研发阶段的性能测试,还是生产环节的质量检测,RF测试设备都扮演着关键角色。然而,要实现精准的RF评估,测试设备需要一种特殊的电路——衰减电路。这些电路的作用是调整RF信号的强度,以便测试设备能够准确地评估RF组件和RF电路的各个方面。衰减器的挑战衰减器的核心功能是校准RF信号的强度。为了实现这一点,衰

    斯丹麦德电子
    04-30 11:33
    609

    ElfBoard嵌入式教育科普|ADC接口全面解析

    当代信息技术体系中,嵌入式系统接口作为数据交互的核心基础设施,构成了设备互联的神经中枢。基于标准化通信协议与接口规范的技术架构,实现了异构设备间的高效数据交换与智能化协同作业。本文选取模数转换接口ADC作为技术解析切入点,通过系统阐释其工作机理、性能特征及重要参数,为嵌入式学习者爱好者构建全维度接口技术认知框架。

    ElfBoard
    04-30 09:34
    339

    深入理解C语言:C语言循环控制

    在C语言编程中,循环结构是至关重要的,它可以让程序重复执行特定的代码块,从而提高编程效率。然而,为了避免程序进入无限循环,C语言提供了多种循环控制语句,如break、continue和goto,用于改变程序的执行流程,使代码更加灵活和可控。本文将详细介绍这些语句的作用及其应用场景,并通过示例代码进行说明。Part.1break语句C语言中break语句有两种

    合众恒跃
    04-29 18:49
    422

    第 21 届(顺德)家电电源与智能控制技术研讨会圆满落幕--其利天下斩获颇丰

    2025年4月25日,其利天下应大比特之邀出席第21届(顺德)家电电源与智能控制技术研讨会,已圆满落幕。一、演讲回顾我司研发总监冯建武先生在研讨会上发表了主题为《重新定义风扇驱动:一套算法兼容百种电机的有效磁链观测器方案》的演讲,介绍了我司研发自适应技术算法(简称),该方案搭载有效磁链观测器,适配百种电机类型,结合FOC算法可实现免调参稳定启动、低速静音控制

    其利天下技术
    04-28 19:29
    1.2k

    来自资深工程师对ELF 2开发板的产品测评

    来自资深工程师对ELF 2开发板的使用测评

    ElfBoard
    04-28 15:03
    474

    飞凌嵌入式2025嵌入式及边缘AI技术论坛圆满结束

    飞凌嵌入式「2025嵌入式及边缘AI技术论坛」在深圳深铁皇冠假日酒店盛大举行,此次活动邀请到了200余位嵌入式技术领域的技术专家、企业代表和工程师用户,共享嵌入式及边缘AI技术的盛宴!

    飞凌嵌入式
    04-28 13:57
    1.5k

    常用运放电路总结记录

    一、电压跟随器电压跟随器,电路图如下:电路分析:(本文所有的运放电路分析,V+表示运放同向输入端的电压,V-表示反向输入端的电压。)1.1电压跟随器反馈电阻需不需要?在上面的电压跟随器示例中,我画上了一个反馈电阻R99,大家在学习的运放的时候,可能很多地方也会提一下这个反馈电阻,很多地方会说可加可不加,效果一样。电阻需不需要加:但是本文这里个人建议使用电压跟

    张飞实战电子官方
    04-27 19:33
    509

    运放-运算放大器经典应用电路大全-应用电路大全-20种经典电路

    20种运放典型电路总结,电路图+公式1、运放的符号表示2、集成运算放大器的技术指标(1)开环差模电压放大倍数(开环增益)大Ao(Ad)=Vo/(V±V-)=107-1012倍;(2)共模抑制比高KCMRR=100db以上;(3)输入电阻大ri>1MW,有的可达100MW以上;(4)输出电阻小ro=几W-几十W3、集成运放分析方法(V+=V-虚短,ib-=ib

    张飞实战电子官方
    04-25 19:34
    400

    RDK X3新玩法:超沉浸下棋机器人开发日记

    一、项目介绍产品中文名:超沉浸式智能移动下棋机器人产品英文名:Hackathon-TTT产品概念:本项目研发的下棋机器人,是一款能自主移动、具备语音交互并能和玩家在真实的棋盘上进行“人机博弈”的移动下棋平台,能够带给对弈者如同真人对弈的完美沉浸式体验——棋开得胜团队。该智能下棋机器人具备3个显著优点:真实棋盘棋子对弈:通过使用真实棋子、棋盘和机械臂,给对弈者

    地瓜机器人
    04-25 18:18
    457

    芯对话 | 微处理器监控电路革新:CBM70X系列 重构系统可靠性

    总述在工业自动化、消费电子、汽车电子等领域,微处理器作为系统核心,其稳定运行依赖可靠的电源监控。据统计,65%的系统故障源于电源异常——工业控制设备因电压波动导致的停机频率每月平均达3.2次,便携式设备因电池管理不当造成的续航缩水普遍超过25%,汽车电子ECU因电源扰动引发的误判率在复杂工况下高达18%。传统监控方案的三大核心痛点极端电压适应性不足:当电压低

    芯佰微电子
    04-25 10:15
    721

    喜讯!米尔电子与安路科技达成IDH生态战略合作,共筑FPGA创新生态

    以芯为基,智创未来。近日,领先的嵌入式模组厂商-米尔电子正式与国产FPGA企业‌安路科技达成IDH生态战略合作‌。双方将围绕安路科技飞龙SALDRAGON系列高性能FPSoC,联合开发核心板、开发板及行业解决方案,助力开发者开发成功,加速工业控制、边缘智能、汽车电子等领域的创新应用落地‌。米尔电子&安路科技IDH生态合作证书‌硬核技术+生态协同‌安路科技作为

    米尔电子
    04-25 08:06
    870

    FOC控制算法详解

    一、基本概念:FOC(field-orientedcontrol)为磁场导向控制,又称为矢量控制(vectorcontrol),是一种利用变频器(VFD)控制三相电机的技术,利用调整变频器的输出频率、输出电压的大小及角度,来控制电机的输出。由于处理时会将三相输出电流及电压以矢量来表示,因此称为矢量控制。二、控制原理:FOC控制的其实是电机的电磁场方向。转子的

    张飞实战电子官方
    04-24 19:33
    908