14.22.2 强制 InnoDB 恢复

要调查数据库页面损坏,您可以使用选择...进入外档从数据库中转储 table。通常,以这种方式获得的大多数数据都是完整的。严重损坏可能导致SELECT * FROM tbl_name语句或InnoDB后台操作崩溃或 assert,甚至导致InnoDB前滚恢复崩溃。在这种情况下,您可以使用innodb_force_recovery选项强制InnoDB存储引擎启动,同时阻止后台操作运行,以便转储 table。例如,您可以在重新启动服务器之前将以下行添加到选项文件的[mysqld]部分:

[mysqld]
innodb_force_recovery = 1

有关使用选项文件的信息,请参见第 4.2.2.2 节“使用选项文件”

Warning

仅在紧急情况下将innodb_force_recovery设置为大于 0 的值,以便您可以启动InnoDB并转储 table。这样做之前,请确保您拥有数据库的备份副本,以防万一您需要重新创建它。值为 4 或更大的值可能会永久损坏数据文件。在数据库的单独物理副本上成功测试设置之后,仅在生产服务器实例上使用innodb_force_recovery设置为 4 或更大。强制InnoDB恢复时,应始终以innodb_force_recovery=1开头,并且仅在需要时才递增该值。

innodb_force_recovery默认为 0(正常启动而不强制恢复)。 innodb_force_recovery的允许非零值为 1 到 6.较大的值包括较小值的功能。例如,值 3 包含值 1 和 2 的所有功能。

如果您能够转储innodb_force_recovery值等于或小于 3 的 table,则相对安全的是,仅丢失了损坏的单个页面上的某些数据。 4 或更大的值被认为是危险的,因为数据文件可能会永久损坏。值 6 被认为是过分的,因为数据库页面处于过时状态,这反过来可能会导致B-trees和其他数据库结构遭受更多破坏。

作为安全措施,InnoDB会在innodb_force_recovery大于 0 时阻止INSERTUPDATEDELETE操作。innodb_force_recovery设置为 4 或更大时会将InnoDB置于只读模式。

使服务器即使检测到损坏的page也可以运行。尝试使SELECT * FROM tbl_name跳过损坏的索引记录和页面,这有助于转储 table。

阻止master thread和任何purge threads运行。如果在purge操作期间发生崩溃,则此恢复值将阻止它。

crash recovery之后不运行事务rollbacks

防止insert buffer合并操作。如果它们会导致崩溃,请不要这样做。不计算 tablestatistics。此值可能会永久损坏数据文件。使用此值后,准备删除并重新创建所有二级索引。将InnoDB设置为只读。

启动数据库时不查看undo logsInnoDB甚至将未完成的事务都视为已提交。此值可能会永久损坏数据文件。将InnoDB设置为只读。

不进行与恢复有关的redo log前滚。此值可能会永久损坏数据文件。使数据库页面处于过时状态,从而可能导致 B 树和其他数据库结构遭受更多破坏。将InnoDB设置为只读。

您可以从 table 中SELECT转储它们。 innodb_force_recovery值等于或小于 3 时,您可以DROPCREATE个 table。 DROP TABLE也受支持,其innodb_force_recovery值大于 3,直至 MySQL 5.7.17. 从 MySQL 5.7.18 开始,不允许DROP TABLEinnodb_force_recovery值大于 4.

如果您知道给定的 table 导致回滚崩溃,则可以将其删除。如果遇到由于批量导入或ALTER TABLE失败而导致的失控回滚,则可以终止mysqld进程并将innodb_force_recovery设置为3以启动数据库而不进行回滚,然后DROP导致导致失控回滚的 table。

如果 table 数据中的损坏阻止您转储整个 table 内容,则带有ORDER BY primary_key DESC子句的查询可能能够转储 table 中损坏部分之后的部分。

如果需要高innodb_force_recovery的值来启动InnoDB,则可能是数据结构已损坏,可能导致复杂的查询(包含WHEREORDER BY或其他子句的查询)失败。在这种情况下,您可能只能运行基本的SELECT * FROM t查询。

首页