Documentation Home

15.18.2 InnoDB 恢复

本节介绍InnoDB恢复。主题包括:

时间点恢复

要将InnoDB数据库从进行物理备份时恢复到现在,您必须在启用二进制日志记录的情况下运行 MySQL 服务器,甚至在进行备份之前。要在还原备份后实现时间点恢复,您可以应用备份后发生的二进制日志中的更改。请参阅 第 7.5 节,“时间点(增量)恢复”

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

如果您的数据库损坏或发生磁盘故障,您必须使用备份执行恢复。在损坏的情况下,首先找到一个没有损坏的备份。恢复基本备份后,使用mysqlbinlogmysql从二进制日志文件进行时间点恢复,以恢复备份后发生的更改。

在某些数据库损坏的情况下,转储、删除和重新创建一个或几个损坏的表就足够了。您可以使用该 CHECK TABLE语句来检查表是否已损坏,但CHECK TABLE自然无法检测到每一种可能的损坏。

在某些情况下,明显的数据库页面损坏实际上是由于操作系统损坏了它自己的文件缓存,而磁盘上的数据可能是好的。最好先尝试重新启动计算机。这样做可能会消除看似数据库页面损坏的错误。InnoDB如果 MySQL 由于一致性问题 仍然无法启动,请参阅第 15.21.3 节,“强制 InnoDB 恢复”以了解以恢复模式启动实例的步骤,这允许您转储数据。

InnoDB 崩溃恢复

要从意外的 MySQL 服务器退出中恢复,唯一的要求是重新启动 MySQL 服务器。 InnoDB自动检查日志并将数据库前滚到现在。 InnoDB自动回滚崩溃时存在的未提交事务。

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

  • 表空间发现

    表空间发现是 InnoDB用于识别需要重做日志应用程序的表空间的过程。请参阅 崩溃恢复期间的表空间发现

  • 重做日志应用

    重做日志应用程序在初始化期间执行,在接受任何连接之前。 如果在关闭或崩溃时所有更改都从缓冲池刷新 到表空间ibdata*和文件),则跳过重做日志应用程序。如果重做日志文件在启动时丢失,也会跳过重做日志应用程序。 *.ibdInnoDB

    • 每次值更改时,当前最大自动递增计数器值都会写入重做日志,这使其不会崩溃。在恢复期间, InnoDB扫描重做日志以收集计数器值更改并将更改应用于内存表对象。

      有关如何InnoDB 处理自动增量值的更多信息,请参阅 第 15.6.1.6 节,“InnoDB 中的 AUTO_INCREMENT 处理”InnoDB AUTO_INCREMENT 计数器初始化

    • 当遇到索引树损坏时, InnoDB将损坏标志写入重做日志,这使得损坏标志不会崩溃。InnoDB还将内存中的损坏标志数据写入每个检查点上的引擎专用系统表。在恢复期间, InnoDB在将内存表和索引对象标记为损坏之前,从两个位置读取损坏标志并合并结果。

    • 不建议删除重做日志来加速恢复,即使一些数据丢失是可以接受的。删除重做日志只应在干净关闭后考虑, innodb_fast_shutdown 设置为01

  • 回滚未完成的 交易

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

    您不能取消正在回滚的事务。在极端情况下,当回滚事务预计需要特别长的时间时,从或更大InnoDBinnodb_force_recovery 设置开始可能会更快。3请参阅 第 15.21.3 节,“强制 InnoDB 恢复”

  • 更改缓冲区 合并

    将更改缓冲区( 系统表空间的一部分)中的更改应用到二级索引的叶页,因为索引页被读取到缓冲池。

  • 清除

    删除对活动事务不再可见的已删除标记的记录。

重做日志应用程序之后的步骤不依赖于重做日志(记录写入除外)并且与正常处理并行执行。其中,只有未完成事务的回滚是崩溃恢复所特有的。插入缓冲区合并和清除在正常处理期间执行。

重做日志应用后,InnoDB尝试尽早接受连接,以减少停机时间。作为崩溃恢复的一部分,InnoDB回滚XA PREPARE服务器退出时未提交或处于状态的事务。回滚由后台线程执行,与来自新连接的事务并行执行。在回滚操作完成之前,新连接可能会遇到与已恢复事务的锁定冲突。

在大多数情况下,即使 MySQL 服务器在繁重的活动中意外终止,恢复过程也会自动发生,无需 DBA 采取任何措施。如果硬件故障或严重的系统错误损坏了 InnoDB数据,MySQL 可能会拒绝启动。在这种情况下,请参阅第 15.21.3 节,“强制 InnoDB 恢复”

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

崩溃恢复期间的表空间发现

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

表空间发现依赖于 innodb_directories设置,它定义了在启动时扫描表空间文件的目录。innodb_directories 默认设置为 NULL,但是 当 InnoDB 构建目录列表以在启动时扫描时,由innodb_data_home_dir, innodb_undo_directory和 定义的目录datadir总是附加到参数值。innodb_directories无论是否 innodb_directories明确指定设置,都会附加这些目录。使用绝对路径定义的表空间文件或位于附加到 innodb_directories设置的目录之外的表空间文件应添加到 innodb_directories环境。如果以前未发现重做日志中引用的任何表空间文件,则恢复将终止。