文档主页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
信息 (Gzip) - 4.0Mb
信息 (Zip) - 4.0Mb


MySQL 9.0 参考手册  /  ...  /  强制 InnoDB 恢复

17.20.3 强制 InnoDB 恢复

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

[mysqld]
innodb_force_recovery = 1

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

警告

仅在紧急情况下才将 innodb_force_recovery 设置为大于 0 的值,以便您可以启动 InnoDB 并转储表。在这样做之前,请确保您有数据库的备份副本,以防您需要重新创建它。值 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 或更小值转储表,那么您相对安全,因为只有损坏的单个页面上的某些数据会丢失。值 4 或更大被认为是危险的,因为数据文件可能会永久损坏。值 6 被认为是极端的,因为数据库页面处于过时状态,这反过来可能会将更多损坏引入 B 树 和其他数据库结构。

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

  • 1 (SRV_FORCE_IGNORE_CORRUPT)

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

  • 2 (SRV_FORCE_NO_BACKGROUND)

    阻止 主线程 和任何 清除线程 运行。如果在 清除 操作期间发生意外退出,则此恢复值会阻止它。

  • 3 (SRV_FORCE_NO_TRX_UNDO)

    崩溃恢复后不运行事务回滚

  • 4 (SRV_FORCE_NO_IBUF_MERGE)

    阻止插入缓冲区合并操作。如果它们会导致崩溃,则不执行它们。不计算表统计信息。此值可能会永久损坏数据文件。使用此值后,请准备好删除并重新创建所有辅助索引。将InnoDB设置为只读。

  • 5 (SRV_FORCE_NO_UNDO_LOG_SCAN)

    启动数据库时不查看撤销日志InnoDB会将即使未完成的事务也视为已提交。此值可能会永久损坏数据文件。将InnoDB设置为只读。

  • 6 (SRV_FORCE_NO_LOG_REDO)

    在恢复过程中不进行重做日志前滚。此值可能会永久损坏数据文件。将数据库页保留在过时状态,这反过来可能会将更多损坏引入 B 树和其他数据库结构。将InnoDB设置为只读。

您可以从表中SELECT以转储它们。如果innodb_force_recovery值为 3 或更小,则可以DROPCREATE表。如果innodb_force_recovery值大于 3,则也支持DROP TABLE。如果innodb_force_recovery值大于 4,则不允许使用DROP TABLE

如果您知道某个给定表在回滚时导致意外退出,则可以将其删除。如果您遇到由失败的大量导入或ALTER TABLE导致的失控回滚,则可以终止mysqld进程并将innodb_force_recovery设置为3,以便在不进行回滚的情况下启动数据库,然后DROP导致失控回滚的表。

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

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