### 15.21.3 强制 InnoDB 恢复

[](<>)[](<>)[](<>)

要调查数据库页面损坏，您可以使用以下命令从数据库中转储表[`选择...进入文件`](select-into.html).通常，通过这种方式获得的大部分数据都是完整的。严重的腐败可能导致`选择 * 从 *`tbl_name`*`陈述或`InnoDB`后台操作意外退出或断言，甚至导致`InnoDB`前滚恢复到崩溃。在这种情况下，您可以使用[`innodb_force_recovery`](innodb-parameters.html#sysvar_innodb_force_recovery)强制选项`InnoDB`存储引擎启动，同时阻止后台操作运行，以便您可以转储表。例如，您可以将以下行添加到`[mysqld]`重新启动服务器之前的选项文件部分：

```
[mysqld]
innodb_force_recovery = 1
```

有关使用选项文件的信息，请参阅[第 4.2.2.2 节，“使用选项文件”](option-files.html).

警告

只设置[`innodb_force_recovery`](innodb-parameters.html#sysvar_innodb_force_recovery)在紧急情况下设置为大于 0 的值，以便您可以启动`InnoDB`并倾倒你的桌子。在这样做之前，请确保您拥有数据库的备份副本，以防需要重新创建它。4 或更大的值可能会永久损坏数据文件。只使用一个[`innodb_force_recovery`](innodb-parameters.html#sysvar_innodb_force_recovery)在数据库的单独物理副本上成功测试设置后，在生产服务器实例上设置为4或更高。强迫的时候`InnoDB`恢复，你应该从[`innodb_force_recovery=1`](innodb-parameters.html#sysvar_innodb_force_recovery)并且仅在必要时递增该值。

[`innodb_force_recovery`](innodb-parameters.html#sysvar_innodb_force_recovery)默认情况下为0（无强制恢复的正常启动）。允许的非零值[`innodb_force_recovery`](innodb-parameters.html#sysvar_innodb_force_recovery)是1比6。较大值包括较小值的功能。例如，值3包括值1和2的所有功能。

如果你能用[`innodb_force_recovery`](innodb-parameters.html#sysvar_innodb_force_recovery)值为3或更小，则相对安全，只有损坏的单个页面上的一些数据会丢失。4或更大的值被认为是危险的，因为数据文件可能会永久损坏。值为6被认为是极端的，因为数据库页面处于过时状态，这反过来可能会给数据库带来更多损坏[B-树](glossary.html#glos_b_tree)以及其他数据库结构。

作为安全措施，`InnoDB`阻止[`插入`](insert.html),[`使现代化`](update.html)或[`删去`](delete.html)什么时候开始行动[`innodb_force_recovery`](innodb-parameters.html#sysvar_innodb_force_recovery)大于0。一[`innodb_force_recovery`](innodb-parameters.html#sysvar_innodb_force_recovery)设置4个或更多位置`InnoDB`在只读模式下。

-   `1.` (`SRV_强制_忽略_腐败`)

    允许服务器运行，即使它检测到损坏的[页](glossary.html#glos_page).试图`从中选择**`tbl\_名称`*`跳过损坏的索引记录和页面，这有助于转储表。

-   `2.` (`SRV_FORCE_无背景`)

    防止[主线程](glossary.html#glos_master_thread)还有[清除线程](glossary.html#glos_purge_thread)从跑步开始。如果在测试期间发生意外退出[净化](glossary.html#glos_purge)操作时，此恢复值会阻止它。

-   `3.` (`SRV_FORCE_NO_TRX_UNDO`)

    不运行事务[回滚](glossary.html#glos_rollback)之后[事故恢复](glossary.html#glos_crash_recovery).

-   `4.` (`SRV_FORCE_NO_IBUF_MERGE`)

    阻止[插入缓冲区](glossary.html#glos_insert_buffer)合并操作。如果它们会导致撞车，就不要这样做。不计算表[统计数字](glossary.html#glos_statistics)。此值可能会永久损坏数据文件。使用此值后，请准备删除并重新创建所有二级索引。设置`InnoDB`只读。

-   `5.` (`SRV_FORCE_NO_UNDO_LOG_SCAN`)

    不看[撤消日志](glossary.html#glos_undo_log)启动数据库时：`InnoDB`即使是不完整的事务也会被视为已提交。此值可能会永久损坏数据文件。设置`InnoDB`只读。

-   `6.` (`SRV_FORCE_NO_LOG_REDO`)

    不起作用[重做日志文件](glossary.html#glos_redo_log)与恢复相关的前滚。此值可能会永久损坏数据文件。使数据库页处于过时状态，这反过来可能会给B树和其他数据库结构带来更多损坏。设置`InnoDB`只读。

    你可以[`选择`](select.html)从桌子上扔下来。带着[`innodb_force_recovery`](innodb-parameters.html#sysvar_innodb_force_recovery)值为3或更少时，您可以`滴`或`创造`桌子。[`升降台`](drop-table.html)还支持一个[`innodb_force_recovery`](innodb-parameters.html#sysvar_innodb_force_recovery)值大于3。[`升降台`](drop-table.html)不允许使用[`innodb_force_recovery`](innodb-parameters.html#sysvar_innodb_force_recovery)值大于4。

    如果知道给定的表在回滚时导致意外退出，则可以删除它。如果遇到由于批量导入失败或[`改变桌子`](alter-table.html)，你可以杀死[**mysqld**](mysqld.html)过程和设置[`innodb_force_recovery`](innodb-parameters.html#sysvar_innodb_force_recovery)到`3.`在没有回滚的情况下启动数据库，然后`滴`导致失控回滚的表。

    如果表数据中的损坏阻止您转储整个表内容，则使用`订购人*`主键`*描述`子句可能能够在损坏的部分之后转储表的部分。

    如果高[`innodb_force_recovery`](innodb-parameters.html#sysvar_innodb_force_recovery)值是启动所必需的`InnoDB`，可能存在损坏的数据结构，可能会导致复杂的查询（包含`哪里`, `订购人`，或其他条款）失败。在这种情况下，您可能只能运行basic`从t中选择*`询问。
