MySQL数据库如何应对故障恢复与数据恢复回滚

一个最基本的数据库,应当可以做到以下几点

  • 数据持久化,可以将数据保存到磁盘,服务重启数据依然存在。

  • 可以按照某种关系存储数据,如果你用过IO流,那么你会发现整理数据也是一件复杂的事情。我是该追加写呢还是找到某条数据位置再进行写呢?这是个很复杂的问题。

  • 快速查找。你想想自己如果将数据写入txt,那又如何高效的去找到某条数据?支持随机查找吗?

  • 故障恢复与数据回滚,倘若你的服务断电了,如何确保数据一定是写入到文件的?若是误删或误改了某条数据,你又如何进行恢复?

MySQL的架构

关于MySQL的简单架构图。

图片

MySQL大致可以分为服务层与存储引擎层。在单独抽离了存储引擎层后,你可以选择合适的引擎,例如InnoDb,MyIsam,Memory等等。

关于不同的存储引擎,使用的方式可能不同。我主要想讲的是InnoDb引擎,MySQL 5.5 版本后默认的存储引擎。

MySQL的日志系统

MySQL有三大日志,分别是重做日志(redo log),二进制日志(bin log),以及回滚日志(undo log)。这三个日志非常重要,学习MySQL数据库一定免不了要和他们打交道。

bin log

bin log是Server层的日志,无论使用的是什么引擎,都可以使用这种日志。这个日志记录的是逻辑日志,就是SQL语句。例如insert into table set xx = xx 在bin log中记录的也是这样的一条SQL。而且bin log 采用的是追加写的形式,也即是说在写完一个bin log文件之后,不会覆盖前面的,而是新开一个文件继续追加写。

redo log

redo log 是存储引擎InnoDB所提供的日志模块。个日志记录的是,物理日志。记录的是当前SQL在哪一个数据页上将什么数据修改为了什么数据。

关于redo log,我很喜欢林晓斌老师在《MySQL实战45讲》中讲的例子,酒馆的账本与黑板的例子。在古时候的酒馆中,老板会有一本账本,以及身后的一块黑板。倘若今天有人去喝酒,赊账。在很忙的时候,老板会将这条记录写在黑板上,后续等到酒馆打烊了,不忙的时候,才将这个记录写进自己的账本中。

事实上,在MySQL也是这么做的,如果每一次的更新操作都需要写进磁盘,然后磁盘也要找到对应的那条记录,然后再更新,整个过程 IO 成本、查找成本都很高。

而黑板和账本配合的整个过程,其实就是 MySQL中常说到的 WAL (Write-Ahead Logging)技术,WAL 的全称是 ,它的关键点就是先写日志,再写磁盘,也就是先写黑板,等不忙的时候再写账本。

具体来说,当有一条记录需要更新的时候,InnoDB 引擎就会先把记录写到 redo log(黑板)里面,并更新内存,这个时候更新就算完成了。同时,InnoDB 引擎会在适当的时候,将这个操作记录更新到磁盘里面,而这个更新往往是在系统比较空闲的时候做,这就像酒馆打烊之后老板做的事。

如果今天赊账的不多,掌柜可以等打烊后再整理。但如果某天赊账的特别多,黑板写满了,又怎么办呢?这个时候掌柜只好放下手中的活儿,把粉板中的一部分赊账记录更新到账本中,然后把这些记录从粉板上擦掉,为记新账腾出空间。

与此类似,InnoDB 的 redo log 是固定大小的,比如可以配置为一组 4 个文件,每个文件的大小是 1GB,那么这块“黑板”总共就可以记录 4GB 的操作。从头开始写,写到末尾就又回到开头循环写,如下面这个图所示。

图片

write pos 是当前记录的位置,一边写一边后移。checkpoint 是当前要擦除的位置,也是往后推移并且循环的,擦除记录前要把记录更新到数据文件。

write pos 和 checkpoint 之间的是“黑板”上还空着的部分,可以用来记录新的操作。如果 write pos 追上 check point,表示“黑板”满了,这时候不能再执行新的更新,得停下来先擦掉一些记录,把 checkpoint 推进一下。

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

要理解 crash-safe 这个概念,可以想想我们前面赊账记录的例子。只要赊账记录记在了粉板上或写在了账本上,之后即使掌柜忘记了,比如突然停业几天,恢复生意后依然可以通过账本和粉板上的数据明确赊账账目。

undo log

undo log 记录的是与执行SQL相反的SQL。例如,在user表,id为1的用户age为32,那么执行update table user set age = 45 where id = 1,那么undo log中则会记录update table user set age = 32 where id = 1,如果执行的是delete语句,那么相应的,它会记录一条insert语句。

undo log是MySQL用于事务模块的重要日志,其中的MVCC(多版本并发控制技术)就与undo log版本链强相关。这篇文章重点不在此,因此不再多说。

MySQL如何做数据恢复

假如在今天的12点钟,你误删了一个表。这种情况下该怎么恢复数据?首先,在使用MySQL时,通常会对其进行全量备份。一般是一天、三天或每周一次。

  • 那么此时应当找到最近的一次全量备份放入临时库中。

  • 找到从全量备份的那一刻开始,将bin log重放到误操作今天的12点钟。

  • 如此你便拿到了误操作之前的数据,此时你可以将临时库中的数据按需要恢复回去。

MySQL如何做到故障恢复?(Crash-Safe的能力)

在InnoDB引擎下,MySQL支持事务。因此故障恢复还需要考虑到已提交的数据与未提交的数据。单独靠bin log 或 redo log 是无法保证crash-safe的。

两阶段提交

一条update语句的简单执行过程

我们再来看执行器和 InnoDB 引擎在执行这个简单的 update 语句时的内部流程。

  1. 执行器先找向存储引擎找到 id = 1 这一行。id 作为主键,存储引擎直接用B+树搜索找到这一行。如果id=1 这行所在的数据页已经在内存中,就直接返回给执行器;否则就先从磁盘读入内存中,再返回。

  2. 执行器拿到存储引擎给的行数据,把这个值加上 1,比如原来是 n,现在为 n+1,得到了一行新的数据,再调用存储引擎的接口写入这一行新的数据。

  3. 引擎将这行新数据更新到内存中,同时将这个更新操作记录到 redo log 里面,此时 redo log 处于 prepare 状态。

  4. 执行器生成这个操作的 binlog,并把 binlog 写入磁盘。

  5. 执行器调用引擎的提交事务接口,引擎把刚刚写入的 redo log 改成提交commit状态。

图片

最后三步看起来有点复杂,InnoDB将 redo log 的写入分为了两个步骤:prepare阶段和commit阶段,这就是两阶段提交

图中白色框表示是在 InnoDB引擎内部执行的,绿色框表示的是在执行器中执行的。

为什么日志需要“两阶段提交”。

由于 redo log 与 bin log 是两个层单独的日志,如果不采用两阶段提交的方式,要么是先写 redo log 再写 bin log,或采用反的顺序。

下面看看这两种方式会出现什么问题。

仍然使用用前面的 update 语句来做例子。假设当前 id=1 的行,字段 a 的值是 0,再假设执行 update 语句过程中在写完第一个日志后,第二个日志还没有写完期间发生了 crash,会出现什么情况呢?

  1. 先写 redo log 后写 binlog。假设在 redo log 写完,binlog 还没有写完的时候,MySQL 进程异常重启。由于我们前面说过的,redo log 写完之后,系统即使崩溃,仍然能够把数据恢复回来,所以恢复后这一行 a 的值是 1。但是由于 binlog 没写完就 crash 了,这时候 binlog 里面就没有记录这个语句。因此,之后备份日志的时候,存起来的 binlog 里面就没有这条语句。然后你会发现,如果需要用这个 binlog 来恢复临时库的话,由于这个语句的 binlog 丢失,这个临时库就会少了这一次更新,恢复出来的这一行 a 的值就是 0,与原库的值不同。

  2. 先写 binlog 后写 redo log。如果在 binlog 写完之后 crash,由于 redo log 还没写,崩溃恢复以后这个事务无效,所以这一行 a 的值是 0。但是 binlog 里面已经记录了 “把 a 从 0 改成 1” 这个日志。所以,在之后用 binlog 来恢复的时候就多了一个事务出来,恢复出来的这一行 a 的值就是 1,与原库的值不同。

可以看到,如果不使用“两阶段提交”,那么数据库的状态就有可能和用它的日志恢复出来的库的状态不一致。

简单说,redo log 和 binlog 都可以用于表示事务的提交状态,而两阶段提交就是让这两个状态保持逻辑上的一致。

总结

学习了挺久的MySQL,突然又对其的数据恢复和故障恢复起了兴趣,往深入了解又发现了之前一些之前无法理解的问题突然迎刃而解了。

  • MySQL的数据恢复与故障恢复依赖着几个日志,bin log 与 redo log。bin log 是逻辑日志,记录的是原始SQL语句,redo log 是InnoDB引擎支持的,是物理日志,记录了在哪个数据页修改了哪些数据,并且redo log 是循环写日志。

  • MySQL需要按照一定时间进行全量备份,这样我们可以依靠最近一次全量备份点,以及从该点开始记录的bin log进行数据重放恢复

  • MySQL在使用了InnoDB引擎后,支持了事务,因此故障恢复需要确保可以区分已提交事务与未提交事务。这个依赖于redo log 的二阶段提交。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

英语语法:连词or, and, if, unless怎么用?

连词or, and, if, unless怎么用?1. or conj. 或者,还是, 和, 否则用法:并列连词①当“或者,还是”讲时,用在选择疑问句中,是选择疑问句的标志例:Are you a teacher or a …

NX二次开发UF_CURVE_create_arc_center_radius 函数介绍

文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_create_arc_center_radius Defined in: uf_curve.h int UF_CURVE_create_arc_center_radius(tag_t center, double radius, tag_t help_point, UF_CURVE_limit_p_t limit_p…

算法通关第十七关青铜挑战——原来贪心如此简单(什么是贪心思想and经典例题分析)

大家好,我是怒码少年小码。 一转眼,又到了11月末尾了,莫名感觉今年真的很快😂。今天的主角是贪心。 贪心的思想非常不好解释,而且越使用权威的语言解释越难懂。而且做题的时候根据自己的理解可能直接做出来&#xff…

HashMap详解(扩容机制、底层结构、适用场景)

1、特点 底层是链表数组,JDK1.8开始,当链表长度超过8时,会将链表转换为红黑树。 储存的是key-value类型数据。 key值不允许重复,key重复会被覆盖,value允许重复。 数据储存无序(不记录存入的顺序&#x…

html学习

1.框架标签 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body ><p align"center"><a href "http://www.baidu.com" target"aa">百度&l…

操作指南 | 如何使用API3请求链下数据

API3是一种去中心化解决方案&#xff0c;用于向智能合约平台提供传统且可扩展的API服务&#xff0c;使开发者能够访问如喂价和QRNG等链下资源。 API3由DAO管理&#xff0c;致力于在智能合约功能中轻松访问各种有用数据。 构建者在Moonbeam上可以访问不同的API3服务&#xff1…

机器学习(1)机器学习类型和机器学习的主要概念

0.前提 深度学习&#xff08;Deep Learing&#xff09;是机器学习&#xff08;Machine Learning&#xff09;领域中的一个新的研究方向&#xff0c;在如今的时代研究深度学习的大模型是十分热门的。我不知道有多少人有关注到最近openai的事件啊&#xff0c;说个比较让我惊讶的…

注意力机制(Q,K,V)基本概念

文章目录 一、注意力提示1.1概念1.2生活中的注意力提示1.3注意力机制基本框架小结 二、注意力汇聚2.1概念2.2非参注意力汇聚2.2.1平均汇聚2.2.2Nadaraya-Waston核回归 2.3通用注意力汇聚公式2.4带参数注意力汇聚小结 三、注意力评分函数3.1概念3.2例子 四、遮蔽softmax三四小结…

【数字化转型方法论读书笔记】-数据中台落地实施之法

让数据中台真正落地是实现数字化转型的重中之重。企业做好数据治理、体系建设及人才配备等前期工作后&#xff0c;接下来要做的是数据中台实施落地的关键。 企业首先要掌握数据中台建设的三大核心要素&#xff1a;选对数据建设方式、厘清建设思路、避开数据中台建设误区&#…

桐庐县数据资源管理局领导一行莅临美创科技并带来感谢信

11月23日&#xff0c;浙江桐庐县数据资源管理局党组成员、副局长朱勃一行到访美创科技总部参观交流&#xff0c;并带来感谢信&#xff0c;对美创圆满完成护航亚运政务外网数据网站安全保障工作表示充分肯定。美创科技联合创始人、副总裁胡江涛等进行热情接待并开展交流座谈。 图…

LeetCode Hot100 437.路径总和III

题目&#xff1a; 给定一个二叉树的根节点 root &#xff0c;和一个整数 targetSum &#xff0c;求该二叉树里节点值之和等于 targetSum 的 路径 的数目。 路径 不需要从根节点开始&#xff0c;也不需要在叶子节点结束&#xff0c;但是路径方向必须是向下的&#xff08;只能从…

skywalking 简单操作文档

1.1. 基础概念 1.1.1. 概述 SkyWalking是 apache基金会下面的一个开源 APM项目&#xff0c;为微服务架构和云原生架构系统设计。它通过探针自动收集所需的指标&#xff0c;并进行分布式追踪。通过这些调用链路以及指标&#xff0c;Skywalking APM会感知应用间关系和服务间关系…

LeetCode(34)有效的数独【矩阵】【中等】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 36. 有效的数独 1.题目 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 &#xff0c;验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗…

宏工科技通过CMMI三级认证,软件研发能力获国际权威认可

近日&#xff0c;宏工科技子公司湖南宏工软件成功通过CMMI三级认证并正式获得资质证书&#xff0c;斩获全球软件领域最权威的认证之一&#xff0c;标志着宏工科技在软件技术开发、研发管理、项目管理等多方面获得国际权威认证。 CMMI全称是Capability Maturity Model Integrati…

芯片技术探索:了解构芯片的设计与制造之旅

芯片技术探索:了解构芯片的设计与制造之旅 一、引言 随着现代科技的飞速发展,芯片作为信息技术的核心,已经渗透到我们生活的方方面面。从智能手机、电视、汽车到医疗设备和工业控制系统,芯片在各个领域都发挥着至关重要的作用。然而,对于大多数人来说,芯片仍然是一个神秘…

【23真题】罕见211!数一配英二!

今天分享的是23年合肥工业大学833的信号与系统数字信号处理试题及解析。合工大833考数一英二&#xff0c;这样的搭配还是很少见的。 本套试卷难度分析&#xff1a;22年合肥工业大学833考研真题&#xff0c;我也发布过&#xff0c;若有需要&#xff0c;戳这里自取!平均分为80和…

3D ACIS Modeler和HOOPS Visualize助力鲁班软件打造BIM数字化平台

鲁班软件成立于2001年&#xff0c;始终致力于BIM技术研发和推广&#xff0c;为建筑产业相关企业提供基于BIM技术的数字解决方案&#xff0c;专注打造能够支撑建筑企业集团发展的BIM数字化平台鲁班工程管理数字平台(Luban Builder)&#xff0c;以及可承载园区级或城市级的BIM、C…

NX二次开发UF_CURVE_create_arc_point_center 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_create_arc_point_center Defined in: uf_curve.h int UF_CURVE_create_arc_point_center(tag_t point, tag_t center, UF_CURVE_limit_p_t limit_p [ 2 ] , tag_t support…

IDEA插件:Apipost-Helper-2.0

我们在编写完接口代码后需要进行接口调试等操作&#xff0c;一般需要打开额外的调试工具。今天就给大家介绍一款IDEA插件&#xff1a;Apipost-Helper-2.0。用它&#xff0c;代码写完直接编辑器内调试、还支持生成接口文档、接口树等功能&#xff0c;并且完全免费&#xff01;非…

3D模型材质编辑器

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 材质贴图&#xff08;Texture Mapping&#xff09;&#xff1a;是在物体着色方面最引人注目、…