当前位置: 首页 > news >正文

【MySQL精通之路】InnoDB(18)-备份与恢复

目录

1.InnoDB备份

1.1 热备份

1.2 冷备份

1.3 使用mysqldump的逻辑备份

2.InnoDB恢复

2.1 实时恢复

2.2 从数据损坏或磁盘故障中恢复

2.3 InnoDB崩溃恢复

2.3.1 表空间发现

2.3.2 Redolog应用程序

2.3.3 未完成交易的回滚

2.3.4 更改缓冲区合并

2.3.5 清除

2.4 故障恢复期间的表空间发现


本节介绍与InnoDB备份和恢复相关的主题。

有关适用于InnoDB的备份技术的信息,请参阅“InnoDB备份”。

有关时间点恢复磁盘故障损坏的恢复以及InnoDB如何执行崩溃恢复的信息,请参阅“InnoDB恢复”

1.InnoDB备份

安全数据库管理的关键是定期备份

根据您的数据量、MySQL服务器数量和数据库工作负载,您可以单独或组合使用这些备份技术:热备份与MySQL Enterprise backup;

MySQL服务器关闭时通过复制文件进行冷备份;

使用mysqldump进行逻辑备份,用于较小的数据卷或记录数据库对象的结构信息

热备份和冷备份是复制实际数据文件的物理备份,mysql直接使用这些文件进行快速恢复。

推荐使用MySQL Enterprise Backup备份工具进行数据备份。

笔记
InnoDB不支持使用第三方备份工具恢复的数据库。

1.1 热备份

        mysqlbackup命令是MySQL Enterprise Backup组件的一部分,它允许您备份正在运行的MySQL实例,包括InnoDB表,在生成数据库的一致快照的同时,对操作的干扰最小。

当mysqlbackup复制InnoDB表时,对InnoDB表的读写可以继续。

MySQL Enterprise Backup还可以创建压缩备份文件,并备份数据库的子集

结合MySQL的Binlog,用户可以执行实时恢复。

MySQL Enterprise Backup是MySQL Enterprise订阅的一部分。

有关更多详细信息,请参阅“MySQL企业备份概述”。

MySQL Enterprise Backup为MySQL数据库执行热备份操作。该产品是为InnoDB存储引擎创建的表的高效可靠备份而设计的。为了完整起见,它还可以备份MyISAM和其他存储引擎中的表。
以下讨论简要总结了MySQL企业备份。有关更多信息,请参阅MySQL Enterprise Backup手册,可在https://dev.mysql.com/doc/mysql-enterprise-backup/en/.
热备份是在数据库运行和应用程序对其进行读写时执行的。这种类型的备份不会阻止正常的数据库操作,甚至可以捕获备份时发生的更改。出于这些原因,当您的数据库“增长”时,热备份是可取的——当数据足够大,备份需要大量时间,当数据对您的业务足够重要,您必须捕获最后的每一次更改,而不会使您的应用程序、网站或web服务离线。
MySQL Enterprise Backup对所有使用InnoDB存储引擎的表进行热备份。对于使用MyISAM或其他非InnoDB存储引擎的表,它会进行“热”备份,数据库会继续运行,但在备份时无法修改这些表。为了高效的备份操作,您可以将InnoDB指定为新表的默认存储引擎,或者将现有表转换为使用InnoDB存储引擎。

1.2 冷备份

如果你可以关闭MySQL服务器,你可以制作一个物理备份,该备份由InnoDB用来管理其表的所有文件组成。使用以下步骤:

1.慢关闭MySQL服务器,并确保其停止时没有错误。

2.将所有InnoDB数据文件(ibdata文件和.ibd文件)复制到一个安全的地方。

3.将所有InnoDB重做日志文件(MySQL 8.0.30及更高版本中的#ib_redoXX文件或早期版本中的ib_logfile文件)复制到安全的地方。

4.将您的my.cnf配置文件复制到安全的地方。

1.3 使用mysqldump的逻辑备份

除了物理备份之外,建议您通过使用mysqldump转储表来定期创建逻辑备份。

二进制文件可能在您没有注意到的情况下被损坏。转储的表存储在可读的文本文件中,因此察觉表损坏变得更容易。

此外,由于格式更简单,发生严重数据损坏的可能性更小

mysqldump还有一个--singletransaction选项,用于在不锁定其他客户端的情况下生成一致的快照。

请参阅“建立备份策略”。

复制与InnoDB表一起工作,因此您可以使用MySQL复制功能在需要高可用性的数据库站点上保留数据库的副本。

请参阅“InnoDB和MySQL主从复制”。

2.InnoDB恢复

2.1 实时恢复

        要将InnoDB数据库从物理备份的时候恢复到现在,您必须在启用二进制日志记录的情况下运行MySQL服务器,甚至在进行备份之前也是如此。

要在恢复备份后实现实时恢复,可以应用备份后二进制日志中的更改。

请参阅“实时(增量)恢复”。

2.2 从数据损坏或磁盘故障中恢复

        如果数据库损坏或发生磁盘故障,则必须使用备份执行恢复。

如果发生损坏,请首先查找未损坏的备份

恢复基本备份后,使用mysqlbinlog和mysql从二进制日志文件中进行实时恢复,以恢复备份后发生的更改。

        在某些数据库损坏的情况下,只需转储删除重新创建一个几个损坏的表就足够了。您可以使用CHECK TABLE语句来检查表是否已损坏,尽管CHECK TABLE自然无法检测到所有可能的损坏类型。

        在某些情况下,明显的数据库页面损坏实际上是由于操作系统损坏了自己的文件缓存,磁盘上的数据。最好先尝试重新启动计算机。这样做可以消除看起来是数据库页面损坏的错误。

如果MySQL仍然因为InnoDB一致性问题而无法启动,

请参阅“强制InnoDB恢复”

了解在恢复模式下启动实例的步骤,这允许您转储数据。

2.3 InnoDB崩溃恢复

要从MySQL服务器意外关闭中恢复,唯一的要求就是重新启动MySQL服务器。

InnoDB会自动检查日志,并将数据回滚到当前位置。InnoDB会自动回滚崩溃时存在的未提交事务。

InnoDB崩溃恢复包括五个步骤:

2.3.1 表空间发现

表空间发现是InnoDB用来识别需要redolog应用程序的表空间的程序。

请参阅下文故障恢复期间的表空间发现。

2.3.2 Redolog应用程序

Redolog应用程序在初始化期间执行,然后再接受任何连接。

如果在关闭或崩溃时将所有更改从缓冲池刷新到表空间ibdata*和*.ibd文件),则会跳过Redolog应用程序

如果启动时缺少重做日志文件,InnoDB也会跳过重做日志应用程序。

每次记录更改时,都会将当前最大自动增量计数器数值写入重做日志,这使其能够安全崩溃。

在恢复过程中,InnoDB扫描Redolog日志以收集计数器值的更改,并将这些更改应用于内存中的表对象。

有关InnoDB如何处理自动增量值的更多信息,请参阅

InnoDB中的AUTO_INCREMENT处理:

InnoDB auto_increment计数器初始化:

当遇到索引树损坏时,InnoDB会向Redolog中写入损坏标志,这使得损坏标志可以安全崩溃。

InnoDB还将内存中的损坏标志数据写入每个检查点上的存储引擎专用系统表。

在恢复过程中,InnoDB从两个位置读取损坏标志并合并结果,然后将内存表索引对象标记为损坏。

不建议删除Redolog以加快恢复速度,即使某些数据丢失是可以接受的。只有在干净关闭之后才应考虑删除Redolog,innodb_fast_shutdown设置为0或1。

2.3.3 未完成交易的回滚

        不完整事务是指在意外退出或快速关闭时处于活动状态的任何事务。回滚不完整事务所需的时间可能是事务中断前活动时间的三到四倍,具体取决于服务器负载。

不能取消正在回滚的事务。在极端情况下,当回滚事务预计需要非常长的时间时,innodb_force_recovery设置为3或更大时InnoDB可能会更快启动。

请参阅“强制InnoDB恢复”。

2.3.4 更改缓冲区合并

在将索引页读取到缓冲池时,将Change Buffer(系统表空间的一部分)中的更改应用于二级索引的叶页。

2.3.5 清除

将删除对于活动事务中不再可见拥有删除标记的记录。


        重做日志应用程序后面的步骤不依赖于redolog(除了记录写操作),并且与正常处理并行执行。其中,只有不完整事务的回滚对于崩溃恢复是特殊的。

insert缓冲区合并和清除是在正常处理过程中执行的。

在重做日志应用程序后,InnoDB尝试尽早接受连接,以减少停机时间。

作为崩溃恢复的一部分,InnoDB回滚服务器退出时未提交或处于XA PREPARE状态的事务。

回滚由后台线程执行,与来自新连接的事务并行执行

在回滚操作完成之前,新连接可能会遇到与已恢复事务的锁冲突。

在大多数情况下,即使MySQL服务器在大量活动中意外死亡,恢复过程也会自动进行,不需要DBA执行任何操作。

如果硬件故障或严重的系统错误损坏了InnoDB数据,MySQL可能会拒绝启动

在这种情况下,请参阅“强制InnoDB恢复”。

有关二进制日志和InnoDB崩溃恢复的信息,请参阅“二进制日志”。

2.4 故障恢复期间的表空间发现

如果在恢复过程中,InnoDB遇到自上一个检查点以来写入的重做日志,则必须将重做日志应用于受影响的表空间。在恢复过程中识别受影响的表空间的过程称为表空间发现。

表空间发现依赖于innodb_directories设置,该设置定义了启动时要扫描的目录以查找表空间文件。

innodb_directories默认设置为NULL,但当innodb构建启动时要扫描的目录列表时,innodb_data_home_dir、innodb_undo_directorydatadir定义的目录总是附加到innodb_directories参数值之后。

无论是否显式指定了innodb_directories设置,都会附加这些目录。

使用绝对路径定义的表空间文件或位于附加到innodb_directories设置的目录之外的表空间应添加到innodd_directories设置中。

如果以前未发现重做日志中引用的任何表空间文件,则恢复将终止。

相关文章:

  • DOS学习-目录与文件应用操作经典案例-ren
  • Python小游戏——俄罗斯方块
  • 蓝桥杯第18489题——拔苗助长(质数+map)
  • 修改元组元素
  • NIO的ByteBuffer和Netty的ByteBuf的性能
  • 服务器数据恢复—服务器raid常见故障表现原因解决方案
  • 测试基础06:软件产品的运行环境dev、sit、test、fat、uat、pre、pro
  • Eclipse下载安装教程(包含JDK安装)【保姆级教学】【2024.4已更新】
  • SpringSession原理简析
  • 【软考中级 软件设计师】计算机网络和安全
  • 软件测试外包公司测试流程分享,与企业内部测试人员的区别有哪些?
  • 【Torch学习笔记】
  • Python中的yield关键字,掌握生成器的精髓
  • linux下宝塔负载100%解决方法
  • 存储+调优:存储-IP-SAN
  • 【附node操作实例】redis简明入门系列—字符串类型
  • 2017-08-04 前端日报
  • Angular4 模板式表单用法以及验证
  • Bytom交易说明(账户管理模式)
  • chrome扩展demo1-小时钟
  • ES6系列(二)变量的解构赋值
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • js作用域和this的理解
  • laravel5.5 视图共享数据
  • leetcode98. Validate Binary Search Tree
  • Linux gpio口使用方法
  • Linux中的硬链接与软链接
  • Mysql5.6主从复制
  • node入门
  • Selenium实战教程系列(二)---元素定位
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • Vue2.0 实现互斥
  • 从重复到重用
  • 动态规划入门(以爬楼梯为例)
  • 后端_ThinkPHP5
  • 基于组件的设计工作流与界面抽象
  • 解析带emoji和链接的聊天系统消息
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 力扣(LeetCode)21
  • 利用jquery编写加法运算验证码
  • 前端面试总结(at, md)
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 正则表达式小结
  • 【干货分享】dos命令大全
  • 国内开源镜像站点
  • 如何正确理解,内页权重高于首页?
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • (回溯) LeetCode 46. 全排列
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (图文详解)小程序AppID申请以及在Hbuilderx中运行
  • (微服务实战)预付卡平台支付交易系统卡充值业务流程设计