首页>资讯>正文
环球观焦点:Mysql实战之日志系统:一条SQL更新语句是如何执行的
2023-02-24 02:00:09    来源:腾讯云

1.前言

上一篇咱们了解了MySQL 的执行过程,其中设计连接器、分析器、优化器、执行器和存储引擎,接下来我将给大家讲解一下在MySQL中一条更新语句是如何执行。我相信大家可能听公司的DBA提起过,可以将数据恢复到半个月内任意时间的状态,是不是感觉很高大上,很厉害呢,下面我就将这个谜底一步一步解开


【资料图】

2. 首次分析更新语句执行

例如我们存在如下一下update 语句

update order set status = 2 where id = 10;

根据上一章,我们可以知道它的执行流程是如下图

在这里插入图片描述

客服端先通过连接器连接数据库,然后通过分析器发现是更新的SQL语句,优化器针对SQL语句进行优化,使用id索引,最后执行器执行SQL语句

到这里大家会说:这不是和查询语句一样吗,都是这些流程,其实不然,更新语句还设计两个比较重要的模块,那就是我们今天主要介绍的内容:redo log(重做日志)和binlog(归档日志)

3.先看redo log

再说将redo log之前,先给大家讲一个关于孔乙己的故事,酒店掌柜有一个粉板,专门用来记录客人的赊账记录。如果赊账的人不多,那么他可以把顾客名和账目写到板上。但是如果赊账的人多了,粉板总会有记不下的时候,这个时候掌柜一定还有一个专门记录赊账的账本。

如果有人要赊账或者还账的话,掌柜一般有两种做法:

直接把账本拿出来,把此次赊的账加上或者扣除掉将此次赊的账记录到粉板上,等打烊了在把账本拿出来,把今天的粉板的账记录到账本

如果是在生意比较火的时候,掌柜肯定会选择第二种方式,因为第一种操作太麻烦了,每次都要从账本里面找到对应人的账,进行计算,然后更新账本。相比之下,先把账记录到粉板上,等打烊在一块统计到账本上,更省时。

MySQL同样也存在类似的问题,就是如果每次更新操作都需要写入磁盘,然后磁盘也要找到对应的记录,然后更新,整个过程IO成本和查找成本都很高。为了解决这个问题,MySQL设计者就采取了类似掌柜粉板的思路来提升更新的效率

当有更新操作执行的时候,InnoDB引擎就会先把记录写到redo log里面,并更新内存,这样更新操作就算结束了。InnoDB引擎会在适当的时候,将这个操作记录更新到磁盘,这个写磁盘的操作一般都是在MySQL比较空闲的时候执行。

这里存在一个问题,就是redo log不可能是无限大的,总有因为频繁操作,将redo log打满的情况,InnoDB的设计人员也考虑到了这一点,将redo log设定成了固定大小,默认是一组四个文件,一个文件1G,也就是说redo log总大小是4GB,下图就是redo log的设计图

在这里插入图片描述

wirte pos是记录当前的位置,一边写一遍后移,写到第三号文件的末尾就回到0号文件开头。checkpoint 是当前要察除的位置,也是往后推移并且循环的,察除记录前要把记录更新到数据文件。

wirte pos和checkpoint 之间还空着的部分,可以用来记录新的操作。如果wirte pos追上checkpoint,标识redo log已经满了,此时不能在执行更新操作,需要将内存的数据同步到磁盘中了。

有了redo log,InnoDB就可以保证即使数据库发生重启,之前提交的记录都不会丢,这个能力称之为crash-safe。

4.再看binlog

上一篇文章我们讲过数据库架构分为两层,一个是server层,一个是存储引擎层,而binlog就属于server层的日志,而redo log是InnoDB独有的日志

说道这里,大家肯定会有一个疑惑,为啥会有两个日志系统呢?

因为一开始MySQL并没有InnoDB引擎,MyISAM是MySQL自带的引擎,但是MyISAM没有日志系统的功能,只存在server层的binlog 归档日志,InnoDB是后来集成到mysql里面去的

下面看一下两种日志的不同点

redo log是InnoDB引擎独有的;binlog是mysql共用的redo log是物理日志,记录的是“在某个数据页上做了什么修改”;binlog是逻辑日志,记录的是这个语句的原始逻辑,比如给id=2这一行的c字段加1.redo log日志是循环写的,空间固定会用完;binlog日志是追加写的,不会覆盖以前的日志

5.再次分析更新语句执行

上面我们对两种日志做了概念性讲解,下面看一下执行器和InnoDB引擎在执行update语句是的内部流程

在这里插入图片描述
执行器先找引擎取到id=2的这一行,因为id是主键,直接可以通过主键索引查到这一行,如果id=2这一行所在的数据页本来就在内存中,执行器直接放回结果,如果不在,在需要将磁盘的数据,写到内存在返回结果执行器会将id=2的这一行的c字段进行加1操作,然后会更新当前行InnoDB引擎将当前行更新到内存后,redo log日志会记录当前更新操作,此时redo log日志处于prepare的状态。然后告知执行器执行完成,可以提交事务了binlog日志会记录当前update语句,并且把binlog写入磁盘执行器调用引擎提交事务,引擎把刚刚写入的redo log改成提交状态(commit),更新完成

大家可以看到我们对redo log日志做了两次提交,也就是我们平常说的两阶段提交

6.两阶段提交

问:为啥需要进行两阶段提交

答:两阶段提交是为了让binlog和redo log可以保持数据一致

问:如果不使用两阶段提交,会产生什么样的问题?

答:如果不存在两阶段提交,那边就会有两种情况。

先写redo log日志,后写binlog日志。如果我们写完了redo log日志,但是binlog日志还没有写,发生了宕机,我们在重启MySQL的时候用binlog恢复数据的话,id=2这一行的数据没有完成加1操作,和之前库的数据不一致了先写binlog日志,后写redo log日志。如果我们写完了binlog日志,但是redo log日志还没有写,发生了宕机,此时事务没有生效,我们通过binlog日志恢复数据,发现id=2这一行已经完成加1操作了,和之前库的数据不一致了

7.小结

今天主要讲了MySQL最重要的两个日志,一个是server层的binlog归档日志,一个是InnoDB引擎的redo log重做日志

redo log 用于保证 crash-safe 能力。innodb_flush_log_at_trx_commit 这个参数设置成 1 的时候,表示每次事务的 redo log 都直接持久化到磁盘。这个参数我建议你设置成 1,这样可以保证 MySQL 异常重启之后数据不丢失。

sync_binlog 这个参数设置成 1 的时候,表示每次事务的 binlog 都持久化到磁盘。这个参数我也建议你设置成 1,这样可以保证 MySQL 异常重启之后 binlog 不丢失。

我还跟你介绍了与 MySQL 日志系统密切相关的“两阶段提交”。两阶段提交是跨系统维持数据逻辑一致性时常用的一个方案,即使你不做数据库内核开发,日常开发中也有可能会用到。

关键词: 云数据库 Server

环球观焦点:Mysql实战之日志系统:一条SQL更新语句是如何执行的

上一篇咱们了解了MySQL的执行过程,其中设计连接器、分析器、优化器、执行器和存储引擎,接下来我将给大家讲解一下在MySQL中一条更新语句是如2023-02-24

17个家庭医生团队进社区,豹澥街为8万居民提供精准医疗服务

17个家庭医生团队进社区,豹澥街为8万居民提供精准医疗服务2023-02-23

企业月薪4万招人去非洲养鸡 公司回应:工资真实但环境艰苦 不招20岁以下年轻人

今天(23日),“企业月薪4万招人去非洲养鸡”引发热议,话题冲上每经热榜第一位。2月23日,山东青岛一企业称月薪3-4万招聘养鸡场场长,工作地点2023-02-23

姐妹新娘第二部全集大结局_姐妹新娘第二部全集 时快讯

1、看过韩国版的人鱼小姐没啦一样的两人还结婚了呢生了宝宝但结局是个开放式结局。本文到此分2023-02-23

字节加入“大模型之战”:朱文佳带队,搜索、智创两部门牵头 最新

字节加入“大模型之战”:朱文佳带队,搜索、智创两部门牵头,算法,智创,朱文佳,字节跳动,大模型之战,羽毛球运动员,奥林匹克运动会2023-02-23

春暖花开藏不住 浙江婺城郁金香花海引游人

各色郁金香争奇斗艳。 黄诗媛摄郁金香花海引游人打卡。 黄诗媛摄郁金香花海似油画。 黄诗媛摄游客在郁金香花海旁拍照。2023-02-23

三国志12隐藏剧本,三国志12统一天下了为什么没有出现你们说的隐藏剧本信长转世剧 全球播报

1,三国志12统一天下了为什么没有出现你们说的隐藏剧本信长转世剧要加强版,我第一次用曹操打的,那个剧本有点坑,战国初始兵都比中国多,万幸2023-02-23

【全球独家】喜获丰收

喜获丰收2023-02-23

中国手球超级联赛 北京体彩队小组赛三连胜

京报体育|记者李远飞2月21日,在中国手球超级联赛第六比赛日的最后一场比赛中,北京体彩男子手球俱乐部经过60分钟鏖战,以41比36 5力挫安徽队2023-02-23

河南焦作郭主任聊天记录堪比狂飙,胡主编还提倡为公仆减负吗-每日看点

河南焦作郭主任聊天记录堪比狂飙,胡主编还提倡为公仆减负吗文 姜诗华宋丹丹在春晚小品中曾经这样说:没有新闻的领导的算不得领导,没有绯闻的2023-02-23

天天消息!涨停股三变科技:公司目前经营情况正常,内外部经营环境未发生重大变化

今日涨停股三变科技2月22日发布异动公告,公司股票连续三个交易日(2023年2月20日、21日、22日)收盘价格涨幅偏离2023-02-23

“连心贷”也要来了 靠猎奇产品激活信贷需求是缘木求鱼

“连心贷”也要来了靠猎奇产品激活信贷需求是缘木求鱼,贷款,房贷,按揭,商业银行,信贷需求,缘木求鱼,金融机构2023-02-22

傲娇萌君你别跑百度云_傲娇萌君你别跑

1、已上传望采纳很抱歉。2、回答者上传的附件已失效。本文就为大家分享到这里,希望小伙伴们会喜欢。2023-02-22

长江中游4省会城市协同12个观察员城市签署“三年计划”

新华社武汉2月21日电(记者熊琦)21日,长江中游城市群省会城市第九届会商会以视频会议形式召开。武汉、长沙、合肥、南昌四2023-02-22

劲拓股份董秘回复:全面注册制是我国资本市场系统性、基础性的制度改革 看点

劲拓股份(300400)02月22日在投资者关系平台上答复了投资者关心的问题。2023-02-22

印尼西部海域发生5.4级地震

据印尼气象、气候和地球物理局消息,当地时间2月22日凌晨2时22分,印尼西部苏门答腊岛锡纳邦西南243公里处海域发生5 4级地震,震中位于北纬2 02023-02-22

环球百事通!脸部缺水,面膜不知道怎么选择?给你介绍一款好用的!

我们的美妆界流行着一种说法,就是杨贵妃使用自己制作出来的面膜,使肌肤得到了很大的改变,但是她使用的面膜和我们现在的是不一样的,那么我2023-02-22

生化危机启示录2解说_生化危机:启示录2

1、《生化危机:启示录2》是由卡普空研发的一款动作冒险游戏,于2015年2月24日发行,是《生化危机启示录》的续作。2、2023-02-22

当前视点!【战锤×光环×小马同人】衣钵觉醒(3)·平静

即使对中心城来说,这一天的盛况也是十分罕见的。因为人类的到来,这一次居住在这个世界上的绝大部分种族都光临了这座城市,美丽而整洁的街道2023-02-22

深圳龙华大浪街道:应征青年第一站 上站体检把关严_环球时快讯

深圳龙华大浪街道:应征青年第一站上站体检把关严2023-02-21

央行在港发行250亿元央票,投标总量超700亿_每日消息

据央行网站21日消息,中国人民银行在香港发行250亿元人民币央行票据。2月21日,中国人民银行在香港成功发行了两期人民币央行票据,其中3个月期2023-02-21

【当前独家】西安学生模拟提案关注桥下空间 将被委员带上全国两会

西安学生模拟提案关注桥下空间将被委员带上全国两会,提案,政协,全国两会,一中,王树声,副校长2023-02-21

新国标明起实施!一马当先,完达山乳业新国标系列奶粉发布会即将盛启

国家卫健委发布的婴幼配方奶粉新国标(以下简称“婴配粉新国标”)将于2月22日起正式实施,届时,按照政策规定,所有市售配方奶都必须按新国标注册2023-02-21

悦心健康:截止2023年2月20日,公司股东总户数73,018户,机构户数232户

悦心健康(002162)02月21日在投资者关系平台上答复了投资者关心的问题。投资者:请问截止2023年2月20日股2023-02-21

香山股份:公司暂未有您所提及的相关计划_天天时快讯

香山股份(002870)02月20日在投资者关系平台上答复了投资者关心的问题。2023-02-21

滚动
资讯