Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


15.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不断崩溃”,和第18.2.4节,“MyISAM表问题”

REPAIR TABLE检查表是否需要升级,如果需要,它将执行升级,遵循CHECK TABLE ... FOR UPGRADE的规则。请参阅第15.7.3.2节,“CHECK TABLE语句”,了解更多信息。

Important
  • 在执行表修复操作前,请先备份表;在某些情况下,操作可能会导致数据丢失。可能的原因包括文件系统错误。请参阅第9章,“备份和恢复”

  • 如果服务器在执行REPAIR TABLE操作时崩溃,重启服务器后,必须立即执行另一个REPAIR TABLE语句,以便访问该表。否则,在最坏的情况下,你可能会损坏数据文件,而下一个操作可能会覆盖数据文件。这是一个不太可能的但可能的场景,这也强调了备份的重要性。

  • 如果源表损坏,并且你运行REPAIR TABLE语句,那么对原始表的任何更改将不会传播到副本中。

REPAIR TABLE 存储引擎和分区支持

REPAIR TABLE 可以用于MyISAMARCHIVECSV表。对于MyISAM表,它的效果与myisamchk --recover <em class="replaceable"><code>tbl_name</code></em>相同。这条语句不支持视图。

REPAIR TABLE 支持分区表。然而,在使用该语句时不能使用USE_FRM选项。

您可以使用 ALTER TABLE ... REPAIR PARTITION 修复一个或多个分区;更多信息,请见第15.1.9节,“ALTER TABLE 语句”第26.3.4节,“分区维护”

  • NO_WRITE_TO_BINLOGLOCAL

    默认情况下,服务器将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索引文件丢失或头部损坏时使用。如果.MYI文件头部信息不可靠,MySQL将使用数据字典中的信息重新创建它。这类修复操作不能使用myisamchk.

    Caution

    使用USE_FRM选项在无法使用常规REPAIR模式时。将服务器忽略.MYI文件会使得表元数据不可用,这可能会产生不良后果:

    • 当前的AUTO_INCREMENT值将被丢失。

    • 表中的链接记录将被丢失,这意味着删除记录的空闲空间将无法被释放。

    • .MYI头部指示表是否压缩。如果服务器忽略这个信息,无法确定表是否压缩,修复操作可能会改变或丢失表内容。这意味着USE_FRM不应该与压缩表一起使用。实际上,这也不是必要的,因为压缩表是只读的,不能变得 corrupt。

    如果使用USE_FRM对一个由不同版本的 MySQL 服务器创建的表,REPAIR TABLE将不尝试修复该表。在这种情况下,REPAIR TABLE返回的结果集包含一行具有Msg_type值为errorMsg_text值为Failed repairing incompatible .FRM file的记录。

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

REPAIR TABLE返回一个结果集,其中包含以下列。

Column Value
Table 表名
Op 总是repair
Msg_type 状态、错误、信息、注意或警告
Msg_text 信息消息

可能会出现REPAIR TABLE语句对每个修复的表生成许多行信息。最后一行的Msg_type值为statusMsg_test通常应该为OK。对于MyISAM表,如果你没有获取OK,你可以尝试使用myisamchk --safe-recover。(REPAIR TABLE不实现myisamchk的所有选项。使用myisamchk --safe-recover,你也可以使用--max-record-length等选项,REPAIR TABLE不支持的选项。)

REPAIR TABLE语句捕捉并抛出在将表统计信息从旧损坏文件复制到新创建文件时发生的任何错误。例如,如果用户ID与mysqld进程的用户ID不同,REPAIR TABLE生成“不能更改文件所有权”的错误,除非mysqld是由mysqld启动的root用户。

你可能可以通过设置某些系统变量来提高REPAIR TABLE性能。见Section 10.6.3, “Optimizing REPAIR TABLE Statements”

REPAIR TABLE语句升级表,如果表包含旧的时间列在pre-5.6.4格式,即TIMEDATETIMETIMESTAMP列缺乏秒精度支持。