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.mzph.cn/web/41193.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32-USART

本内容基于江协科技STM32视频学习之后整理而得。 文章目录 1. 串口通信协议1.1 通信接口1.2 串口通信1.3 硬件电路1.4 电平标准1.5 串口参数及时序1.6 串口时序 2. USART串口通信2.1 USART简介2.2 USART框图2.3 USART基本结构2.4 数据帧2.5 数据帧-配置停止位2.6 起始位侦测2.…

DP学习——简单工厂模式

学而时习之,温故而知新。 敌人出招(使用场景) 不同的业务场景下要创建不同的对象,但是这些对象又有共同的特点。如何复用代码呢?你会想到,这些对象可以抽象出一个基类/抽象类就行了,那么随着业…

【Python】一文向您详细介绍 argparse中 action=‘store_true’ 的作用

【Python】一文向您详细介绍 argparse中 action‘store_true’ 的作用 下滑即可查看博客内容 🌈 欢迎莅临我的个人主页 👈这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地!🎇 🎓 博主简介:98…

pdf怎么转换成图片格式文件,pdf文档怎么转换成图片格式

在数字化时代,pdf文件转换成图片格式是一种常见的操作,无论是在工作还是日常生活中,我们总会遇到需要将pdf文件转换为图片的需求。这可能是因为图片格式更易于分享、展示或编辑。那么,如何高效地将pdf转换成图片呢?本文…

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

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

深度解析:如何利用Python高效挖掘SQLite潜力

Python与SQLite共舞:构建高效轻量级数据库应用实战 Python,作为一门优雅且强大的编程语言,搭配轻巧灵活的SQLite数据库,无疑为我们提供了挥洒创意的完美画布。今天,咱们就通过一个鲜活的案例,一起探索如何…

leetcode77组合——经典回溯算法

本文主要讲解组合的要点与细节,以及回溯算法的解题步骤,按照步骤思考更方便理解 c和java代码如下,末尾 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 具体要点: …

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

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.概述 在去中心化控制及多任务环境中,多智能体合作问题因原始感官观察、高昂…

【机器学习】机器学习重塑广告营销:精准触达,高效转化的未来之路

📝个人主页🌹:Eternity._ 🌹🌹期待您的关注 🌹🌹 ❀目录 📒1. 引言📙2. 机器学习基础与广告营销的结合🧩机器学习在广告营销中的核心应用领域🌹用…

【React】React18 Hooks 之 useReducer

目录 useReducer案例1:useReducer不带初始化函数案例2:useReducer带初始化函数注意事项1:dispatch函数不会改变正在运行的代码的状态注意事项2:获取dispatch函数触发后 JavaScript 变量的值注意事项3:触发了reducer&am…

webrtc sfu性能压测

1. 前言 不少网友最近私信我,咨询webrtc sfu服务端性能问题,SRS开源服务能支持多少路webrtc流,mediasoup单房间能支持多少个人,推流能接入多少路,拉流能拉取多少路?720p能支持多少路,360p能支持…

Spring Boot集成olingo快速入门demo

1.什么是olingo? Apache Olingo 是个 Java 库,用来实现 Open Data Protocol (OData)。 Apache Olingo 包括服务客户端和 OData 服务器方面。 Open Data Protocol (开放数据协议,OData) 是用来查询和更新数据的一种W…

【吊打面试官系列-MyBatis面试题】MyBatis 实现一对多有几种方式,怎么操作的?

大家好,我是锋哥。今天分享关于 【MyBatis 实现一对多有几种方式,怎么操作的?】面试题,希望对大家有帮助; MyBatis 实现一对多有几种方式,怎么操作的? 有联合查询和嵌套查询。联合查询是几个表联合查询,只查询一次,通过…

观察矩阵(View Matrix)、投影矩阵(Projection Matrix)、视口矩阵(Window Matrix)及VPM矩阵及它们之间的关系

V表示摄像机的观察矩阵(View Matrix),它的作用是把对象从世界坐标系变换到摄像机坐标系。因此,对于世界坐标系下的坐标值worldCoord(x0, y0, z0),如果希望使用观察矩阵VM将其变换为摄像机坐标系下的坐标值localCoord(x…

【渗透入门】HTTP请求包

文章目录 前言HTTP GET请求包HTTP POST请求包Content-Type 前言 HTTP(HyperText Transfer Protocol)请求包,是Web通信的基础。HTTP请求包格式主要由以下几部分组成: 请求行:包含了请求方法(GET、POST、PUT…

32单片机,C语言与汇编联合编译的几种方式

适用编译器:Keil5 方式一: 单独创建一个.s汇编文件,在汇编文件内对函数进行EXPORT声明 r0寄存器是函数传入的第一个参数,r1寄存器是函数传入的第二个参数,以次类推。参数最多不确定是到r4为止,还是到r12…

Node.js-path 模块

path 模块 path 模块提供了 操作路径 的功能,如下是几个较为常用的几个 API: 代码实例: const path require(path);//获取路径分隔符 console.log(path.sep);//拼接绝对路径 console.log(path.resolve(__dirname, test));//解析路径 let pa…

Robust Regression

最小二乘回归受数据中的离群点的影响较大,稳健回归通过降低离群点的影响缓解此问题。M估计法是稳健回归的重要方法之一,M 估计法的目标函数为: m i n ∑ ρ ( ϵ i ) m i n ∑ ρ ( y i − β ^ ∗ X i ) min\sum\rho(\epsilon_i) min\sum\…

vulhub-activemq(CVE-2016-3088)

在 Apache ActiveMQ 5.12.x~5.13.x 版本中,默认关闭了 fileserver 这个应用(不过,可以在conf/jetty.xml 中开启);在 5.14.0 版本后,彻底删除了 fileserver 应用。【所以在渗透测试过程中要确定好 ActiveMQ …

word 使用手册

word 文档中如何将下行的指定文字退格到上行中 就像是这样的 编号:111 密码:222 编号:123 密码:321 编号:124 密码:331 变成 编号:111密码:222 编号:123密码&#xff1…