本节介绍 InnoDB
恢复。主题包括
要将 InnoDB
数据库从物理备份创建的时间点恢复到当前状态,您必须使用启用了二进制日志的 MySQL 服务器运行,即使在执行备份之前也是如此。为了在恢复备份后实现时间点恢复,您可以应用备份后发生的二进制日志中的更改。请参阅 第 9.5 节,“时间点(增量)恢复”。
如果您的数据库损坏或发生磁盘故障,您必须使用备份执行恢复。如果发生损坏,首先找到一个未损坏的备份。在恢复基本备份后,使用 mysqlbinlog 和 mysql 从二进制日志文件中进行时间点恢复,以恢复备份后发生的更改。
在某些数据库损坏情况下,只需要转储、删除和重新创建一个或多个损坏的表即可。您可以使用 CHECK TABLE
语句检查表是否损坏,尽管 CHECK TABLE
自然无法检测到所有可能的损坏类型。
在某些情况下,明显的数据页面损坏实际上是由于操作系统损坏了它自己的文件缓存,而磁盘上的数据可能没问题。最好先尝试重新启动计算机。这样做可能会消除看起来像是数据页面损坏的错误。如果 MySQL 由于 InnoDB
一致性问题而仍然无法启动,请参阅 第 17.20.3 节,“强制 InnoDB 恢复” 以了解在恢复模式下启动实例的步骤,这允许您转储数据。
要从意外的 MySQL 服务器退出中恢复,唯一的要求是重新启动 MySQL 服务器。 InnoDB
会自动检查日志并执行数据库的正向恢复到当前状态。 InnoDB
会自动回滚崩溃时存在的未提交事务。
InnoDB
崩溃恢复 包含以下几个步骤
表空间发现
表空间发现是
InnoDB
用于识别需要重做日志应用的表空间的过程。请参阅 崩溃恢复期间的表空间发现。重做日志 应用
重做日志应用是在初始化期间执行的,在接受任何连接之前。如果在关闭或崩溃时将所有更改从 缓冲池 刷新到 表空间 (
ibdata*
和*.ibd
文件),则会跳过重做日志应用。如果在启动时缺少重做日志文件,InnoDB
也会跳过重做日志应用。每次自动增量计数器值发生变化时,都会将其写入重做日志,这使其具有崩溃安全性。在恢复期间,
InnoDB
会扫描重做日志以收集计数器值变化,并将变化应用到内存中的表对象。有关
InnoDB
如何处理自动递增值的更多信息,请参见 第 17.6.1.6 节,“InnoDB 中的 AUTO_INCREMENT 处理” 和 InnoDB AUTO_INCREMENT 计数器初始化。当遇到索引树损坏时,
InnoDB
会将损坏标志写入重做日志,这使得损坏标志成为崩溃安全的。InnoDB
还会在每个检查点将内存中损坏标志数据写入引擎私有系统表。在恢复期间,InnoDB
会从这两个位置读取损坏标志,并将结果合并,然后将内存中表和索引对象标记为损坏。不建议删除重做日志以加快恢复速度,即使可以接受一些数据丢失。删除重做日志应仅在干净关机后考虑,并将
innodb_fast_shutdown
设置为0
或1
。
未完成的事务是指在意外退出或 快速关机 时处于活动状态的任何事务。回滚未完成事务所需的时间可能是事务在中断之前处于活动状态时间的 3 或 4 倍,具体取决于服务器负载。
您无法取消正在回滚的事务。在极端情况下,如果回滚事务预计会花费异常长的时间,则启动
InnoDB
时使用innodb_force_recovery
设置为3
或更大的值可能更快。请参见 第 17.20.3 节,“强制 InnoDB 恢复”。变更缓冲区 合并
将来自变更缓冲区(系统表空间 的一部分)的更改应用于二级索引的叶页面,因为索引页面被读取到缓冲池。
删除不再对活动事务可见的已标记为删除的记录。
在重做日志应用之后执行的步骤不依赖于重做日志(除了记录写入之外),并且与正常处理并行执行。其中,只有回滚未完成的事务是崩溃恢复所特有的。插入缓冲区合并和清除在正常处理过程中执行。
在应用重做日志之后,InnoDB
会尽早尝试接受连接,以减少停机时间。作为崩溃恢复的一部分,InnoDB
会回滚在服务器退出时未提交或处于 XA PREPARE
状态的事务。回滚由后台线程执行,与来自新连接的事务并行执行。在回滚操作完成之前,新连接可能会遇到与已恢复的事务的锁定冲突。
在大多数情况下,即使 MySQL 服务器在繁忙活动过程中意外终止,恢复过程也会自动发生,DBA 不需要进行任何操作。如果硬件故障或严重系统错误损坏 InnoDB
数据,MySQL 可能会拒绝启动。在这种情况下,请参见 第 17.20.3 节,“强制 InnoDB 恢复”。
有关二进制日志和 InnoDB
崩溃恢复的信息,请参见 第 7.4.4 节,“二进制日志”。
如果在恢复期间,InnoDB
遇到自上次检查点以来写入的重做日志,则必须将重做日志应用于受影响的表空间。在恢复期间识别受影响表空间的过程称为 表空间发现。
表空间发现依赖于 innodb_directories
设置,该设置定义了启动时扫描表空间文件以寻找表空间文件的目录。 innodb_directories
的默认设置为 NULL,但由 innodb_data_home_dir
、innodb_undo_directory
和 datadir
定义的目录始终附加到 innodb_directories
参数值,当 InnoDB 在启动时构建要扫描的目录列表时。这些目录的附加与是否显式指定 innodb_directories
设置无关。使用绝对路径定义的或位于附加到 innodb_directories
设置的目录之外的表空间文件应添加到 innodb_directories
设置中。如果在重做日志中引用的任何表空间文件之前未发现,则恢复将终止。