MySQL如何保证数据不丢失?

发布于:2024-10-24 编辑:匿名 来源:网络

前言上一篇文章《InnoDB在SQL查询中的关键功能和优化策略》讲解了InnoDB的查询操作和优化事项。然而,由于MySQL是一个数据存储产品,如何保证数据的持久性和不丢失是最重要的。

如果您有兴趣,可以关注这篇文章来了解一下。 Buffer Pool与DML的关系。

InnoDB中的“Buffer Pool”不仅在查询时起到提高效率的作用,而且为了减少插入、更新、删除等DML操作时与磁盘的频繁交互,这些更新也会被放在第一位。对Buffer Pool中缓存的数据页进行操作,然后将这些更新的“脏页”刷新到磁盘。

这次涉及到一个问题:如果MySQL服务宕机了,内存中更新的数据会丢失吗?答案是肯定会有丢失,但是MySQL尽力防止数据丢失。接下来我们看看MySQL是怎么做的。

这里把结构图贴出来,方便后面介绍的时候理解。这里插入图片来描述DML操作过程。

加载数据页。从上面可以看出,行记录位于数据页中。

因此,当InnoDB接收到DML操作请求时,它仍然会寻找“数据页”,并且搜索过程会跟上。文档查询行记录的过程是一样的。

这里先说一下,插入请求会根据主键索引找到数据页,更新和删除会根据查询条件找到数据页。简而言之,必须先将“数据页”加载到“Buffer Pool”中,然后才能执行下一步。

update记录定位到数据页后,insert操作是向数据页添加一行记录,delete是标记该行记录的‘删除标记’,update是先删除再添加。这是因为存在可变长度字段类型。

,例如 varchar。每次更新时,该类数据占用的内存不固定,所以先删除,再添加。

这里的删除标记是行记录的字段,即除了业务字段数据之外,InnoDB默认为每行记录添加字段,所以一条行记录大致如下图,也就是“行”格式”前面提到过。在此插入图片说明。

找到数据页并更新记录后,DML操作完成,但还没有落地到磁盘上。这时候直接刷盘还不能算是完成了吗?数据持久化方案是可以的,但是如果每次DML操作都需要flush一个16KB的数据页到磁盘,效率极低,估计没人会用MySQL。

但是,如果数据没有刷新到磁盘,MySQL服务就会宕机,数据就会丢失。MySQL 这里的解决方案是等待合适的时间将批量的“脏页”异步刷新到磁盘。

首先,将更新的记录以日志的形式快速刷新到磁盘。我们先看第一点,什么时候合适?在适当的时间冲洗磁盘。

当“Buffer Pool”中的“脏页”达到一定阈值时,InnoDB会将这些脏页刷新到磁盘。这个阈值可以通过innodb_max_dirty_pages_pct参数查看或设置。

相关命令如下: 代码语言:sql copy -- 查看脏页刷新阈值 show Variables like 'innodb_max_dirty_pages_pct' -- 在线设置脏页刷新阈值。当脏页在Buffer Pool中占据70时刷新SET GLOBAL innodb_max_dirty_pages_pct = 70%。

在此插入图片说明。当然,这个适当的时间只是为了减少与磁盘的交互,提高性能。

它不能保证数据不会丢失。使用双写机制刷新“脏页”时还有一个非常重要的注意事项:因为InnoDB的页面大小为16KB,而一般操作系统的页面大小为4KB。

这意味着当InnoDB将这些“脏页”刷新到磁盘时,它会在操作系统层面被分为4个4KB页。在这种情况下,如果由于MySQL宕机或者其他异常,其中某一页没有成功刷新到磁盘,就会出现“页面损坏”,导致数据不完整。

在此插入图片说明。因此,这里InnoDB采用的双写机制,会将这些“脏页”先写入到结构图中的“Doublewrite Buffer”中,然后再刷新到磁盘,然后再刷新到对应的表空间。

,当发生故障时,可以通过双写缓冲区进行恢复。 “Doublewrite Buffer”会不会造成“页面损坏”? “Doublewrite Buffer”的大小是独立且固定的,不根据页面大小进行划分。

因此,它不受操作系统中页面大小的限制,并且不会发生“页面损坏”。另外,先使用顺序IO将数据页写入“Doublewrite Buffer”,然后使用随机IO异步刷新到表空间也可以提高写入性能。

这里插入图片描述,看第二点。为什么要先以日志的形式刷新到磁盘呢? log-first机制更新“Buffer Pool”中的数据页后,由于这些“脏页”不会及时刷新到磁盘,为了避免数据丢失,会写入本次DML操作的副本“日志缓冲区”并将其刷新到磁盘。

与16KB数据页相比,数据量会小很多。而且写入日志文件时是append操作,是顺序IO,效率很高。

如下图所示,哪种写法效率更高,一目了然。在此插入图片说明。

这里所说的日志文件就是经常听到的“Redo Log”。即使MySQL宕机了,通过磁盘上的redolog,也可以将数据尽可能恢复到MySQL启动时宕机前的样子。

当然,还有“撤消日志”。由于与本文的重点没有直接影响,所以不再赘述。

这种日志优先(WAL)机制也是MySQL用来提高效率和保证数据可靠性的一种方式。为什么要尽可能恢复?日志刷新机制因为“Log Buffer”中的日志数据何时刷新到磁盘是由innodb_flush_log_at_trx_commit和innodb_flush_log_at_timeout这两个参数决定的。

innodb_flush_log_at_trx_commit 默认为1,表示每次事务提交后都会刷新到磁盘。当innodb_flush_log_at_trx_commit设置为0时,不会根据事务提交进行刷新,而是根据innodb_flush_log_at_timeout设置的时间定时刷新,默认为1秒。

当innodb_flush_log_at_trx_commit设置为2时,日志仅写入操作系统中的缓存,然后根据innodb_flush_log_at_timeout定期刷新。注意:如果事务在innodb_flush_log_at_timeout内没有发生,也会被刷新到磁盘。

如果MySQL服务宕机时,“Log Buffer”中的日志没有刷新到磁盘,这部分数据也会丢失,重启后也无法恢复。所以如果不想丢失数据,在性能可以接受的情况下,尽量将innodb_flush_log_at_trx_commit设置为1。

“重做日志”如何恢复数据?重做日志恢复数据。首先,重做日志会记录DML操作类型、数据表空间、数据页以及具体修改内容。

以insert into t1(1,'hi')为例,对应的重做日志内容大致如下 此处插入图片说明。如果innodb_flush_log_at_trx_commit的值为1,那么当DML操作事务提交时,重做日志将被刷新到磁盘。

成功刷新到磁盘后,就可以认为数据已经成功写入。此时,如果“脏页”在刷新到磁盘之前就崩溃了,那么MySQL下次启动时就会加载重做日志。

如果重做日志中包含数据,则表示需要恢复该数据。这时就可以通过重做日志的内容来重构“脏页”,将其恢复到宕机前的状态。

如何构建“脏页”?事实上,每次写入重做日志时都会记录一个“LSN(日志序列号)”,这个值记录了“数据页”中最后修改的日志序列位置。 MySQL在启动时通过LSN比较重做日志和数据页。

如果数据页中的LSN小于重做日志的LSN,则数据页将被加载到“Buffer Pool”中,然后根据重做日志的内容构造“脏页”。 ”,等待下一次刷新到磁盘,数据就会恢复。

此处插入图片描述,如下所示。注意:此恢复过程侧重于重做。

其实还涉及到“Change Buffer”、“Undo Log”等操作。这里不做解释。

“Doublewrite Buffer”和“redo log”都是恢复数据,不是冲突吗?不存在冲突。 “Doublewrite Buffer”恢复“页面损坏”的整个数据页,而Redo Log只能恢复某个DML操作。

综上所述,InnoDB通过以上操作可以尽可能保证MySQL不丢失数据。最后我们总结一下MySQL是如何保证数据不丢失的:为了避免频繁与磁盘交互,每个DML操作都会先将页面缓存在“缓冲池”中,执行过程中缓存页面就变成了“脏页面”更新后,然后根据参数innodb_max_dirty_pages_pct将“脏页”刷新到磁盘。

由于在“脏页”刷新到磁盘之前可能会出现MySQL宕机等异常行为,导致数据丢失,因此MySQL使用log-ahead(WAL)机制将DML操作以日志的形式记录到“重做日志”中,然后根据innodb_flush_log_at_trx_commit和innodb_flush_log_at_timeout这两个参数将“Redo Log”Flush到磁盘进行恢复。在刷新“脏页”到磁盘时,为了避免“页损坏”,InnoDB采用双写机制,首先将这些脏页依次写入“Doublewrite Buffer”,然后异步刷新数据页到各个表空间。

,这种方法不仅可以提高写入效率,还可以保证数据的完整性。如果MySQL在“脏页”刷新到磁盘之前崩溃了,则下次启动时将通过重做日志构造脏页以实现数据恢复。

通过以上步骤,MySQL尽可能不丢失数据。我正在参加第五期腾讯科技创造特训营有奖征文比赛。

MySQL如何保证数据不丢失?

站长声明

版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。

标签:

相关文章

  • 麦当劳怎么想的?他们甚至用外卖垃圾来拍摄广告

    麦当劳怎么想的?他们甚至用外卖垃圾来拍摄广告

    在外卖越来越不可或缺的今天,外卖包装也成为了品牌和商家相互角逐的“战场”。 因疫情无法送货上门,写字楼楼下、小区门口的外卖堆积如山。 显眼且易于识别的包装也可能成为影响顾客下单的重要因素。 ▲ 设计师 Eslam Mhd 为星巴克、可口可乐、汉堡王、必胜客、麦当劳、品客

    06-21

  • 江西另一基金中基金260亿

    江西另一基金中基金260亿

    投资界-解码LP获悉,近日,江西吉安公开遴选了全市产业发展引导基金中的基金管理人。 本次选定的基金管理人必须负责子基金的募集工作。 募集资金可由基金管理人或其关联方出资,且不得低于子基金缴纳总额的30%。 据悉,该基金总规模1亿元,初始规模50亿元,采用母子基金运作“

    06-17

  • 深耕创新药领域,国信医药获近亿元首轮融资

    深耕创新药领域,国信医药获近亿元首轮融资

    据投资界9月25日消息,国信医药科技(北京)有限公司已完成近亿元融资首轮融资1亿元。 本轮投资方包括悦银医疗资本以及多家行业领先上市公司旗下的产业基金。 据悉,完成本轮融资后,国信药业将继续深耕创新药和疫苗临床试验服务领域,完善产业链布局,扩大业务和利润规模,

    06-17

  • 梅耶博格计划于 2022 年推出太阳能光伏屋顶瓦

    梅耶博格计划于 2022 年推出太阳能光伏屋顶瓦

    为此,这家瑞士集团已从一家未透露姓名的德国工程服务提供商处收购了一体化太阳能屋顶系统解决方案,旨在在利基市场开始拓展这一领域。 瑞士 MeyerBurger 公司刚刚通过其位于德国萨克森自由州的生产线生产出了首款异质结 Smartwire 太阳能模块,并已在计划下一步。 该公司周

    06-08

  • 普发真空助力CMS半导体应用

    普发真空助力CMS半导体应用

    ——空气分子污染物控制技术,半导体制造业先进工艺中使用的AMC(空气分子污染物)和微小颗粒的检测和控制技术,例如集成电路的生产工艺,许多关键工艺步骤基于真空技术。 在硅加工过程中使用真空技术有几个原因: 真空可以控制条件,因为它排除了硅晶圆中的环境空气,例如反

    06-06

  • “代码大模型”成为AI新趋势,aiXcoder想让所有企业抢先使用

    “代码大模型”成为AI新趋势,aiXcoder想让所有企业抢先使用

    4月9日,北大软件工程学院开源了其aiXcoder全新自研7B代码大模型团队。 作为“AI+软件开发”领域的专业团队,aiXcoder开源的7B大代码模型或将给企业“软件工程”带来新的可能。 在美国,AI软件开发工具GitHub Copilot的ARR(年度经常性收入)已达到1亿美元,成为AI向开发者应

    06-18

  • 工业和信息化部国际经济技术合作中心与施耐德电气战略合作签约仪式在京举行

    工业和信息化部国际经济技术合作中心与施耐德电气战略合作签约仪式在京举行

    近日,工业和信息化部国际经济技术合作中心与施耐德电气战略合作签约仪式在京举行。 工信部与施耐德电气第二季度绿色智能制造共赢计划启动。 中心与施耐德电气作为本次活动的协办单位,并联手亚信安全、中科创达、亚马逊云科技、清华大学全球产业研究院等,共同开发中小企业数

    06-18

  • 华为Mate40国行版发布! 4999元起,也是全球首款搭载“数字人民币钱包”的手机

    华为Mate40国行版发布! 4999元起,也是全球首款搭载“数字人民币钱包”的手机

    10月底,华为Mate40系列“国内发布会”如期而至。 在本次发布会上,相信大家最期待和关心的就是一周前亮相的“华为全家桶”的售价。 这里就不多做作了,直接开门见山,为大家揭晓Mate40系列的国行定价。 Mate40全系列售价高达人民币,涵盖“中杯”、“大杯”、“特大杯”以及

    06-21

  • 亚朵酒店提交美股IPO申请

    亚朵酒店提交美股IPO申请

    据美国证监会披露文件,中国连锁酒店亚朵提交美股IPO申请,中金公司、美银、招银国际、花旗集团为联席保荐人。 年收入15.67亿元,年收入15.66亿元,利润分别为1万元、1万元。

    06-17

  • 医疗器械公司天助瑞畅完成近6000万元A轮融资,由同创伟业

    医疗器械公司天助瑞畅完成近6000万元A轮融资,由同创伟业

    投资界(ID:pedaily)领投 据5月28日消息,北京天助瑞畅医疗科技有限公司(简称“天助瑞畅”) 》)宣布已累计完成近6000万元。 1万元A轮融资。 本轮增资由同创伟业领投,腾业创投、天使轮投资方乔景资本跟投。 天助瑞畅公司于2007年在北京成立,是一家专注于创新主动脉覆膜

    06-17

  • 国务院公布第三批92个双创示范基地,首次提及退出机制

    国务院公布第三批92个双创示范基地,首次提及退出机制

    日前,国务院办公厅印发《关于建设第三批大众创业万众创新示范基地的通知》(以下简称《通知》),正式公布第三批92个双创示范基地。 与前两批按地区、企业、高校划分维度不同,本批示范基地对示范基地进行了差异化的功能定位,分为创业就业、集成创新、精益创业、全球创业四

    06-18

  • SmartSens正式推出“SmartSensor”AI智能传感器芯片平台概念

    SmartSens正式推出“SmartSensor”AI智能传感器芯片平台概念

    SmartSens正式推出“SmartSensor”AI智能传感器芯片平台概念 合作平台汇聚全产业链力量,探索“智能传感器”无限可能2020年12月9日,领先的CMOS图像传感器供应商SmartSens宣布正式推出“SmartSensor”AI智能传感器芯片平台概念(以下简称“SmartSensor平台”)。 “SmartSens

    06-06