Documentation Home

13.7.3.5 修复表语句

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

REPAIR TABLE修复可能损坏的表,仅适用于某些存储引擎。

此语句需要表SELECTINSERT权限。

尽管通常情况下您永远不必运行 REPAIR TABLE,但如果发生灾难,此语句很可能会从MyISAM表中取回所有数据。如果您的表经常损坏,请尝试找出原因,以消除使用REPAIR TABLE. 请参阅 第 B.3.3.3 节,“如果 MySQL 持续崩溃怎么办”第 16.2.4 节,“MyISAM 表问题”

REPAIR TABLE检查表以查看是否需要升级。如果是,它会执行升级,遵循与 相同的规则 CHECK TABLE ... FOR UPGRADE。有关详细信息,请参阅第 13.7.3.2 节,“CHECK TABLE 语句”

重要的
  • 在执行表修复操作之前备份表;在某些情况下,该操作可能会导致数据丢失。可能的原因包括但不限于文件系统错误。请参阅 第 7 章,备份和恢复

  • 如果服务器在REPAIR TABLE操作期间退出,则在重新启动它之后,必须立即 REPAIR TABLE对表执行另一条语句,然后再对其执行任何其他操作。在最坏的情况下,您可能有一个新的干净的索引文件,但没有关于数据文件的信息,然后您执行的下一个操作可能会覆盖数据文件。这是一种不太可能但可能发生的情况,它强调了首先进行备份的价值。

  • 如果源上的表损坏并且您REPAIR TABLE在其上运行,则对原始表的任何由此产生的更改都 不会传播到副本。

REPAIR TABLE 存储引擎和分区支持

REPAIR TABLE适用于 MyISAMARCHIVECSV表格。对于 表,默认情况下与myisamchk --recover MyISAM具有相同的效果。此语句不适用于视图。 tbl_name

REPAIR TABLE分区表支持。但是,该USE_FRM 选项不能与分区表上的此语句一起使用。

您可以ALTER TABLE ... REPAIR PARTITION用来修复一个或多个分区;有关详细信息,请参阅第 13.1.9 节,“ALTER TABLE 语句”第 24.3.4 节,“分区维护”

修复表选项
  • NO_WRITE_TO_BINLOG或者 LOCAL

    默认情况下,服务器将REPAIR TABLE语句写入二进制日志,以便它们复制到副本。要禁止记录日志,请指定可选NO_WRITE_TO_BINLOG关键字或其别名LOCAL

  • QUICK

    如果您使用该QUICK选项, REPAIR TABLE将尝试仅修复索引文件,而不修复数据文件。这种类型的修复类似于myisamchk --recover --quick所做的修复。

  • EXTENDED

    如果使用该EXTENDED选项,MySQL 将逐行创建索引,而不是通过排序一次创建一个索引。这种类型的修复类似于myisamchk --safe-recover所做的修复。

  • USE_FRM

    如果索引文件丢失或其标头已损坏,USE_FRM则可以使用 该选项。.MYI该选项告诉 MySQL 不要信任.MYI 文件头中的信息,并使用数据字典中的信息重新创建它。这种修复不能用 myisamchk完成。

    警告

    当您不能使用常规 模式时才 使用该USE_FRM选项 。告诉服务器忽略该文件会使存储在修复过程中的重要表元数据 不可用,这可能会产生有害后果: REPAIR.MYI.MYI

    • 当前AUTO_INCREMENT值丢失。

    • 表中已删除记录的链接丢失,这意味着已删除记录的可用空间此后仍未被占用。

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

    如果您使用USE_FRM的表是由不同版本的 MySQL 服务器创建的,而不是您当前正在运行的版本, REPAIR TABLE则不会尝试修复该表。在这种情况下,由 返回的结果集REPAIR TABLE包含一个 Msg_type值为 error和一个 Msg_text值为 的行Failed repairing incompatible .FRM file

    如果USE_FRM使用, REPAIR TABLE则不检查表以查看是否需要升级。

修复表输出

REPAIR TABLE返回一个结果集,其列如下表所示。

柱子 价值
Table 表名
Op 总是repair
Msg_type status, error, info,notewarning
Msg_text 信息性消息

REPAIR TABLE语句可能会为每个已修复的表生成多行信息。最后一行的Msg_type值为 , status通常Msg_test 应为OK。对于一个 MyISAM表,如果你没有得到 OK,你应该尝试用 myisamchk --safe-recover修复它。(REPAIR TABLE不实现 myisamchk 的所有选项使用myisamchk --safe-recover,您还可以使用REPAIR TABLE 不支持的选项,例如 --max-record-length。)

REPAIR TABLEtable 捕获并抛出将表统计信息从旧的损坏文件复制到新创建的文件时发生的任何错误。例如。.MYD如果or.MYI文件所有者的 用户 ID 与mysqld 进程的用户 ID 不同,REPAIR TABLE则会生成“无法更改文件所有权”错误,除非 mysqldroot用户启动。

表修复注意事项

REPAIR TABLE如果表包含 5.6.4 之前格式的旧时间列(TIMEDATETIMETIMESTAMP不支持小数秒精度的列)并且 avoid_temporal_upgrade禁用系统变量,则升级表。如果 avoid_temporal_upgrade启用,则REPAIR TABLE忽略表中存在的旧时间列并且不升级它们。

要升级包含此类临时列的表,请 avoid_temporal_upgrade在执行之前禁用REPAIR TABLE

您可以REPAIR TABLE通过设置某些系统变量来提高性能。请参阅第 8.6.3 节,“优化 REPAIR TABLE 语句”