#### 13.7.3.5 修复表语句

[](<>)

```
REPAIR [NO_WRITE_TO_BINLOG | LOCAL]
    TABLE tbl_name [, tbl_name] ...
    [QUICK] [EXTENDED] [USE_FRM]
```

[`维修台`](repair-table.html)仅针对某些存储引擎修复可能损坏的表。

该声明要求[`选择`](privileges-provided.html#priv_select)和[`插入`](privileges-provided.html#priv_insert)表的特权。

虽然通常你不应该运行[`维修台`](repair-table.html)，如果灾难来袭，这句话很可能会从一个`MyISAM`桌子。如果您的表经常损坏，请尝试找出原因，以消除使用[`维修台`](repair-table.html).看[第 B.3.3.3 节，“如果 MySQL 不断崩溃怎么办”](crashing.html)， 和[第 16.2.4 节，“MyISAM 表问题”](myisam-table-problems.html).

[`维修台`](repair-table.html)检查表以查看是否需要升级。如果是这样，它执行升级，遵循相同的规则[`检查表...升级`](check-table.html).看[第 13.7.3.2 节，“CHECK TABLE 语句”](check-table.html)， 了解更多信息。

重要的

-   在执行表修复操作之前对表进行备份；在某些情况下，该操作可能会导致数据丢失。可能的原因包括但不限于文件系统错误。看[第七章，*备份和恢复*](backup-and-recovery.html).

-   如果服务器在一个[`维修台`](repair-table.html)操作，重新启动后必须立即执行另一个[`维修台`](repair-table.html)在对表执行任何其他操作之前为表声明。在最坏的情况下，您可能有一个新的干净索引文件，但没有有关数据文件的信息，然后您执行的下一个操作可能会覆盖数据文件。这是一种不太可能但可能的情况，它强调了首先进行备份的价值。

-   如果源上的表损坏并且您运行[`维修台`](repair-table.html)在其上，对原始表的任何更改都是*不是*传播到副本。

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

-   [修复表存储引擎和分区支持](repair-table.html#repair-table-support)

-   [修复表选项](repair-table.html#repair-table-options)

-   [修复表输出](repair-table.html#repair-table-output)

-   [表修复注意事项](repair-table.html#repair-table-table-repair-considerations)

##### 修复表存储引擎和分区支持

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

[`维修台`](repair-table.html)效劳于[`MyISAM`](myisam-storage-engine.html),[`档案`](archive-storage-engine.html)， 和[`CSV`](csv-storage-engine.html)表。为了[`MyISAM`](myisam-storage-engine.html)表，它具有相同的效果[**myisamchk --recover*`tbl_name`***](myisamchk.html)默认。此语句不适用于视图。

[`维修台`](repair-table.html)支持分区表。然而`USE_FRM`选项不能与分区表上的此语句一起使用。

您可以使用`ALTER TABLE ...修复分区`修复一个或多个分区；有关详细信息，请参阅[第 13.1.9 节，“ALTER TABLE 语句”](alter-table.html)， 和[第 24.3.4 节，“分区维护”](partitioning-maintenance.html).

##### 修复表选项

[](<>)

-   `NO_WRITE_TO_BINLOG`要么`当地的`

    默认情况下，服务器写入[`维修台`](repair-table.html)对二进制日志的语句，以便它们复制到副本。要禁止记录，请指定可选的`NO_WRITE_TO_BINLOG`关键字或其别名`当地的`.

-   `快的`

    如果您使用`快的`选项，[`维修台`](repair-table.html)尝试仅修复索引文件，而不是数据文件。这种维修方式就像[**myisamchk --recover --quick**](myisamchk.html).

-   `扩展`

    如果您使用`扩展`选项，MySQL 逐行创建索引，而不是通过排序一次创建一个索引。这种维修方式就像[**myisamchk --安全恢复**](myisamchk.html).

-   `USE_FRM`

    这`USE_FRM`选项可以使用，如果`。我的我`索引文件丢失或其标头已损坏。此选项告诉 MySQL 不要信任`。我的我`文件头并使用数据字典中的信息重新创建它。这种修复不能用[**迈萨姆奇克**](myisamchk.html).

    警告

    使用`USE_FRM`选项*只要*如果你不能使用常规`维修`模式。告诉服务器忽略`。我的我`文件使重要的表元数据存储在`。我的我`无法用于修复过程，这可能会产生有害后果：

    -   目前的`自动递增`价值丢失。

    -   表中已删除记录的链接丢失，这意味着已删除记录的可用空间此后保持未占用。

    -   这`。我的我`header 指示表是否被压缩。如果服务器忽略此信息，则无法判断表已压缩，并且修复可能会导致表内容更改或丢失。这意味着`USE_FRM`不应与压缩表一起使用。无论如何，这不应该是必需的：压缩表是只读的，因此它们不应该损坏。

        如果你使用`USE_FRM`对于由不同版本的 MySQL 服务器创建的表，而不是您当前运行的表，[`维修台`](repair-table.html)不尝试修复表。在这种情况下，返回的结果集由[`维修台`](repair-table.html)包含一行`消息类型`的价值`错误`和一个`消息文本`的价值`无法修复不兼容的 .FRM 文件`.

        如果`USE_FRM`用来，[`维修台`](repair-table.html)不检查表以查看是否需要升级。

##### 修复表输出

[](<>)

[`维修台`](repair-table.html)返回具有下表所示列的结果集。

| 柱子 | 价值 |
| --- | --- |
| `桌子` | 表名 |
| `操作` | 总是`维修` |
| `消息类型` | `状态`,`错误`,`信息`,`笔记`， 要么`警告` |
| `消息文本` | 信息性消息 |

这[`维修台`](repair-table.html)语句可能会为每个已修复的表生成许多行信息。最后一行有一个`消息类型`的价值`状态`和`消息测试`通常应该是`好的`.为一个`MyISAM`表，如果你没有得到`好的`，你应该尝试修复它[**myisamchk --安全恢复**](myisamchk.html).([`维修台`](repair-table.html)没有实现的所有选项[**迈萨姆奇克**](myisamchk.html).和[**myisamchk --安全恢复**](myisamchk.html)，您还可以使用以下选项[`维修台`](repair-table.html)不支持，比如[`--最大记录长度`](myisamchk-repair-options.html#option_myisamchk_max-record-length).)

[`维修台`](repair-table.html)table 捕获并抛出在将表统计信息从旧的损坏文件复制到新创建的文件时发生的任何错误。例如。如果所有者的用户 ID`.MYD`要么`。我的我`文件与用户 ID 不同[**mysqld**](mysqld.html)过程，[`维修台`](repair-table.html)生成“无法更改文件的所有权”错误，除非[**mysqld**](mysqld.html)由`根`用户。

##### 表修复注意事项

[`维修台`](repair-table.html)如果表包含 5.6.4 之前格式的旧时态列，则升级表（[`时间`](time.html),[`约会时间`](datetime.html)， 和[`时间戳`](datetime.html)不支持小数秒精度的列）和[`避免临时升级`](server-system-variables.html#sysvar_avoid_temporal_upgrade)系统变量被禁用。如果[`避免临时升级`](server-system-variables.html#sysvar_avoid_temporal_upgrade)已启用，[`维修台`](repair-table.html)忽略表中存在的旧时间列并且不升级它们。

要升级包含此类临时列的表，请禁用[`避免临时升级`](server-system-variables.html#sysvar_avoid_temporal_upgrade)在执行之前[`维修台`](repair-table.html).

你也许可以增加[`维修台`](repair-table.html)通过设置某些系统变量来提高性能。看[第 8.6.3 节，“优化 REPAIR TABLE 语句”](repair-table-optimization.html).
