MySQL之备份与恢复(九)

备份与恢复

从备份中恢复

更高级的恢复技术

复制和基于时间点的恢复使用的是相同的技术:服务器的二进制日志。这意味着复制在恢复时会是个非常有帮助的工具,哪怕方式不是很明显。下面将演示一些可以用到的方法。这里列出来的不是一个完整的列表,但应该可以为你根据需求设计恢复方案带来一些想法。记得编写脚本,并且对恢复过程中需要用到的所有技术进行预演。shijian

  • 1.用于快速恢复的延时复制
    在前面已经提到,如果有一个延时的备库,并且在备库执行问题语句之前就发现了问题,那么基于时间点的恢复就更快更容易了。恢复的过程与前面说的有点不一样,但思路是相同的。停止备库,用START SLAVE UNTIL来重放事件直到要执行问题语句。接着,执行SET GLOBAL SQL _SLAVE_SKIP_COUNTER=1来跳过问题语句。如果想跳过多个事件,可以设置一个大于1的值(或简单地使用CHANGE MASTER TO 来前移备库在日志中的位置)。然后要做的就是执行START SLAVE,让备库执行完所有的中继日志。这样就利用贝克u完成了基于时间点的恢复中所有冗余的工作。现在可以将备库提升为主库,整个恢复过程基本上没有中断服务。即使没有延时的备库来加速恢复,普通的备库也有好处,至少会把主库的二进制日志复制到另外的及其上。如果主库的磁盘坏了。备库上的中继日志可能就是唯一能够获取到的最接近主库二进制的东西了
  • 2.使用日志服务器进行恢复
    还有另外一种使用复制来做恢复的方法:设置日志服务器。我们感觉复制比mysqlbinlog更可靠,mysqlbinlog可能会有一些导致异常行为的奇怪的Bug和不常见的情况。使用日志服务器进行恢复比mysqlbinlog更灵活更简单,不仅因为START SLAVE UNTIL选项,还因为那些可以采用的复制规则(replicate-do-table)。使用日志服务器,相对其他的方式来说,可以做到更复杂的过滤。例如,使用日志服务器可以轻松地恢复单个表。而用mysqlbinlog和命令行工具则要困难得多——事实上,这样做太复杂了,所以我们一般不建议进行尝试。假设粗心的开发人员像前面地例子一样删除了同样地表,现在想恢复此误操作,但又不想让整个服务器退到昨晚地备份。下面是利用日志服务器进行恢复地步骤:
  • 2.1 将需要恢复的服务器叫作server1
  • 2.2 在另外一台叫作server2的服务器上恢复做完的备份。在这台服务器上运行恢复进程,以免在恢复时犯错而导致事情更糟
  • 2.3 按照前面的做法设置日志服务器来接收server1的二进制日志(复制日志到另外一个服务器并设置日志服务器是个好象发,但是要格外注意)
  • 2.4 改变server2的配置文件,增加如下内容:
replicate-do-table=sakila.payment
  • 2.5 重启server2,然后用CHANGE MASTER TO来让它成为日志服务器的备库。配置它从昨晚备份的二进制日志坐标读取。这时候切记不要运行START SLAVE
  • 2.6 检测server2上的SHOW SLAVE STATUS的输出,验证一切正常。要三思而行!
  • 2.7 找到二进制日志中问题语句的位置,在server2上执行START SLAVE UNTIL来重放事件直到该位置。
  • 2.8 在server2上用STOP SLAVE停掉复制进程。现在应该有被删除表,因为现在从库停止在被删除之前的时间点
  • 2.9 将所需表从server2复制到server1.

只有没有任何多表的UPDATE、DELETE或INSERT语句操作这个表时,上述流程才是可行的。任何这样的多表操作语句在被记录的时候,可能时基于多个数据库的状态,而不仅仅时当前要恢复的这个数据库,所以这样恢复出来的数据可能和原始的有所不同。(只有在使用基于语句的二进制日志时才会有这个问题;如果使用的是基于行的日志,重放过程不会碰到这个问题)

InnoDB崩溃恢复

InnoDB在每次启动时都会检测数据和日志文件,以确认是否需要执行恢复过程。而且InnoDB的恢复过程与前面的讨论不是一回事。它并不是恢复备份的数据;而是根据日志文件将事务应用到数据文件,将未提交的变更从数据文件中回滚。精确地描述InnoDB如何进行恢复工作,这有点太过复杂。我们要关注的焦点是当InnoDB有严重问题时如何实际执行恢复。大部分情况下InnoDB可以很好地解决问题。除非MySQL有Bug或硬件问题,否则不需要做任何非常规的事情,哪怕时服务器意外地断电。InnoDB会在启动时执行正常的恢复,然后一切就正常了,在日志文件中,可以看到如下信息。

InnoDB Doing recovery :scanned up to log sequence number 0 40817239
InnoDB: Starting an apply batch of log records to the database...

InnoDB会在日志文件中输出恢复进度的百分比信息。有些人说直到整个过程完成才能看到这些信息。耐心点,这个恢复过程是急不来的。如果心急而杀掉进程并重启,只会导致需要更长的恢复事件。如果服务器硬件有严重问题,例如内存或磁盘损坏,或遇到了MySQL或InnoDB的Bug,可能就不得不介入,这是要么进行强制恢复,要么阻止正常恢复发生。

InnoDB损坏的原因

InnoDB非常健壮且可靠,并且有许多的内建安全检测来防止、检测和修复损坏的数据——比其他MySQL存储引擎要强很多。然而,InnoDB并不能保护自己避免一切错误。最起码,InnoDB依赖于无缓存的IO调用和fsync()调用,直到数据完全地写入到物理介质上才会返回。如果硬件不能保证写入的持久化,InnoDB也就不能保证数据的持久,崩溃就有可能导致数据损坏。很多InnoDB损坏问题都是与硬件有关的(例如,因电力问题或内存损坏而导致损坏页的写入)。然而,在过往的经验中,错误配置的硬件是更多的问题之源。常见的错误配置包括打开了不包含电池备份电源的RAID卡的回写缓存,或打开了硬盘驱动器本身的回写缓存。这些错误将会导致控制器或驱动器"撒谎",在数据实际上只写入到回写缓存上而不是磁盘上时,却说fsync()已经完成。换句话说,硬件没有提供保持InnoDB数据安全的保证。有时候及其默认就会这样配置,因为这样做可以得到更好的性能——对于某些场景确实很好,但是对事务数据服务来说却是个大问题。如果在网络附加存储(NAS)上运行InnoDB,也可能会遇到损坏,因为对NAS设备来说完成fsync()只是意味着设备接收到了数据。如果InnoDB崩溃,数据是安全的,但如果是NAS设备崩溃就不一定了。严重的损坏会使InnoDB或MyISAM崩溃,而不那么严重的损坏则可能只是由于日志文件未真正同步到磁盘而丢掉了某些事务

如何恢复损坏的InnoDB数据

InnoDB损坏有三种主要类型,它们对数据恢复有着不同程度的要求.

  • 1.二级索引损坏
    一般可以用OPTIMIZE TABLE来修复损坏的二级索引;此外,也可以用SELECT INTO OUTFILE,删除和重建表,然后LOAD DATA INFILE的方法。(也可以将表改为使用MyISAM再改回来)。这些过程都是通过构建一个新表重建受影响的索引,来修复损坏的索引数据
  • 2.聚簇索引损坏
    如果是聚簇索引损坏,也许只能使用innodb_forece_recovery选项来导出表。有时导出过程会让InnoDB崩溃;如果出现这样的情况,或许需要跳过导致崩溃的损坏页以导出其他的记录.聚簇索引的损坏比二级索引要更难修复,因为它会影响数据行本身,但在多数场合下只需要修复受影响的表。
  • 3.损坏系统结构
    系统结构包括InnoDB事务日志,表空间的撤销日志(undo log)区域和数据字典。这种损坏可能需要做整个数据库的导出和还原,因为InnoDB内部绝大部份的工作都可能受到影响

一般可以修复损坏的二级索引而不丢失数据。然而,另外两种情形经常会引起数据的丢失。如果已经有备份,那最好还是从备份中还原,而不是试着从损坏的文件里区提取数据。如果必须从损坏的文件里提取数据,那一般过程是先尝试让InnoDB运行起来,然后使用SELECT INTO OUTFILE导出数据。如果服务器已经崩溃,并且每次启动InnoDB都会崩溃,那么而可以配置InnoDB停止常规恢复和后台进程的运行。这样也许可以启动服务器,然后在缺少或不做完整性检查的情况下做逻辑备份。innodb_forece_recovery参数控制着InnoDB在启动和常规操作时要做哪一种类型的操作。通常情况下这个值是0,可以增大到6.MySQL使用手册里记录了每个数值究竟会产生什么行为;再次我们不会重复这段信息,但是要告诉你:在有点危险的前提下,可以把这个数值调高到4.使用这个设置时,若有数据页损坏,将会丢失一些数据;如果将数值设得更高,可能会从损坏的页里提取到坏掉的数据。或者增加执行SELECT INTO OUTFILE时崩溃的风险。换句话说,这个值直到4都对数据没有损害,但可能丧失修复问题的机会,而到5和6会更主动地修复问题,但损害数据的风险也会很大。当把innodb_force_recovery设为大于0的某个值时,InnoDB基本上是只读的,但是仍然可以创建和删除表。这可以阻止进一步的损坏,InnoDB会放松一些常规检查,以便在发现坏数据时不会特意崩溃。在常规操作中,这样做是由安全保障的。但是在恢复时,最好还是避免这样做。如果需要执行InnoDB强制恢复,有个好主意是配置MySQL使它在操作完成之前不接受常规的连接请求。
如果InnoDB的数据损坏到了根本不能启动MySQL的程度,还可以使用Percona出品的InnoDB Recovery Toolkit从表空间的数据文件里直接抽取数据。Percona Server还有允许服务器在某些表损坏时仍能运行的选项,而不是像MySQL那样在单个表损坏页被检测出时就默认强制崩溃

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

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

相关文章

PostgreSQL 如何优化存储过程的执行效率?

文章目录 一、查询优化1. 正确使用索引2. 避免不必要的全表扫描3. 使用合适的连接方式4. 优化子查询 二、参数传递1. 避免传递大对象2. 参数类型匹配 三、减少数据量处理1. 限制返回结果集2. 提前筛选数据 四、优化逻辑结构1. 分解复杂的存储过程2. 避免过度使用游标 五、事务处…

STM32快速复习(八)SPI通信

文章目录 前言一、SPI是什么?SPI的硬件电路?SPI发送的时序?二、库函数二、库函数示例代码总结 前言 SPI和IIC通信算是我在大学和面试中用的最多,问的最多的通信协议 IIC问到了,一般SPI也一定会问到。 SPI相对于IIC多了…

Apache Seata分布式事务原理解析探秘

本文来自 Apache Seata官方文档,欢迎访问官网,查看更多深度文章。 本文来自 Apache Seata官方文档,欢迎访问官网,查看更多深度文章。 前言 fescar发布已有时日,分布式事务一直是业界备受关注的领域,fesca…

批量文本编辑管理神器:一键修改多处内容,轻松转换编码,助力工作效率飞跃提升!

在信息爆炸的时代,文本处理已成为我们日常工作中不可或缺的一部分。无论是处理文档、整理数据还是编辑资料,都需要对大量的文本进行管理和修改。然而,传统的文本编辑方式往往效率低下,容易出错,难以满足现代工作的高效…

水箱高低水位浮球液位开关

水箱高低水位浮球液位开关概述 水箱高低水位浮球液位开关是一种用于监测和控制水箱中液位的自动化设备,它能够在水箱液位达到预设的高低限制时,输出开关信号,以控制水泵或电磁阀的开闭,从而维持水箱液位在一个安全的范围内。这类设…

做有一个有表情且会动的 Finder

作为一只合格的互联网巡回猎犬,今天给大家分享一个有趣且无聊的小工具,摸鱼发呆必备,可以说是一件「无用良品」了。 软件介绍 Mouse Finder 长的跟访达差不多,功能也一样,但有一个重要区别:眼睛会跟随鼠标…

图神经网络实战(16)——经典图生成算法

图神经网络实战(16)——经典图生成算法 0. 前言1. 图生成技术2. Erdős–Rnyi模型3. 小世界模型小结系列链接 0. 前言 图生成算法是指用于创建模拟图或网络结构的算法,这些算法可以根据特定的规则和概率分布生成具有特定属性的图&#xff0c…

Open3D 计算点云的粗糙度

目录 一、概述 二、代码实现 2.1 方法一 2.2方法二 三、实现效果 3.1原始点云 3.2计算后的点云 一、概述 点粗糙度(Point Roughness)是点云数据处理中一个重要的几何特征,它描述了一个点附近表面的平滑程度或不规则程度。计算点粗糙度…

硬件开发笔记(二十四):贴片电容的类别、封装介绍,AD21导入贴片电容、原理图和封装库3D模型

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/140241817 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…

【手写数据库内核组件】01 解析树的结构,不同类型的数据结构组多层的链表树,抽象类型统一引用格式

不同类型的链表 ​专栏内容: postgresql使用入门基础手写数据库toadb并发编程 个人主页:我的主页 管理社区:开源数据库 座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物. 文章目录 不同类型…

将大型语言模型模块化打造协作智能体

B UILDING C OOPERATIVE E MBODIED A GENTS MODULARLY WITH L ARGE L ANGUAGE M ODELS 论文链接: https://arxiv.org/abs/2307.02485https://arxiv.org/abs/2307.02485 1.概述 在去中心化控制及多任务环境中,多智能体合作问题因原始感官观察、高昂…

1、spring5.2.x源码解读之下载源码和编译

1、下载源码 1.1、git下载源码 git地址:https://gitcode.net/mirrors/spring-projects/spring-framework.git 1.2、源码导入idea 源码下载地址:https://gitcode.net/mirrors/spring-projects/spring-framework/-/archive/5.2.x/spring-framework-5.2…

LeetCode题练习与总结:直线上最多的点数--149

一、题目描述 给你一个数组 points ,其中 points[i] [xi, yi] 表示 X-Y 平面上的一个点。求最多有多少个点在同一条直线上。 示例 1: 输入:points [[1,1],[2,2],[3,3]] 输出:3示例 2: 输入:points [[1,…

Golang | Leetcode Golang题解之第220题存在重复元素III

题目: 题解: func getID(x, w int) int {if x > 0 {return x / w}return (x1)/w - 1 }func containsNearbyAlmostDuplicate(nums []int, k, t int) bool {mp : map[int]int{}for i, x : range nums {id : getID(x, t1)if _, has : mp[id]; has {retu…

安卓备忘录App开发

安卓备忘录APP开发,文章末尾有源码和apk安装包 目标用户: 普通安卓手机用户,需要一个简单易用的备忘录App来记录和管理日常事务。 主要功能: 用户注册: 用户可以创建一个账号,输入用户名和密码。 用户登录: 用户可以通过用户名和密码登录到应用。 用户信息存储: 用户名和…

算法010:无重复字符的最长子串

无重复字符的最长子串. - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/longest-substring-without-repeating-characters/ 使用的算法:滑动窗口 在这个…

Qt/C++音视频开发78-获取本地摄像头支持的分辨率/帧率/格式等信息/mjpeg/yuyv/h264

一、前言 上一篇文章讲到用ffmpeg命令方式执行打印到日志输出,可以拿到本地摄像头设备信息,顺藤摸瓜,发现可以通过执行 ffmpeg -f dshow -list_options true -i video“Webcam” 命令获取指定摄像头设备的分辨率帧率格式等信息,会…

飞书 API 2-4:如何使用 API 将数据写入数据表

一、引入 上一篇创建好数据表之后,接下来就是写入数据和对数据的处理。 本文主要探讨数据的插入、更新和删除操作。所有的操作都是基于上一篇(飞书 API 2-4)创建的数据表进行操作。上面最终的数据表只有 2 个字段:序号和邮箱。序…

FairJob:促进在线广告系统公平性研究

在人工智能(AI)与人类动态的交汇处,既存在机遇也存在挑战,特别是在人工智能领域。尽管取得了进步,但根植于历史不平等中的持续偏见仍然渗透在我们的数据驱动系统中,这些偏见不仅延续了不公平现象&#xff0…

生成式AI的短板在于“Token”的存在

生成式AI模型处理文本的方式与人类不同。理解它们基于“token”的内部环境,可能有助于解释一些奇怪行为和固有局限性。 从小型设备上的Gemma到OpenAI领先行业的GPT-4o,大多数模型都是基于一种称为Transformer的架构。由于Transformer在将文本与其他类型…