REPAIR [NO_WRITE_TO_BINLOG | LOCAL]
TABLE tbl_name [, tbl_name] ...
[QUICK] [EXTENDED] [USE_FRM]
REPAIR TABLE
修复可能损坏的表,仅适用于某些存储引擎。
尽管通常情况下您永远不必运行
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
适用于
MyISAM
、
ARCHIVE
和
CSV
表格。对于
表,默认情况下与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 ,note 或
warning |
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 TABLE
table 捕获并抛出将表统计信息从旧的损坏文件复制到新创建的文件时发生的任何错误。例如。.MYD
如果or.MYI
文件所有者的
用户 ID 与mysqld
进程的用户 ID 不同,REPAIR TABLE
则会生成“无法更改文件所有权”错误,除非
mysqld由
root
用户启动。
REPAIR TABLE
如果表包含 5.6.4 之前格式的旧时间列(TIME
、
DATETIME
和
TIMESTAMP
不支持小数秒精度的列)并且
avoid_temporal_upgrade
禁用系统变量,则升级表。如果
avoid_temporal_upgrade
启用,则REPAIR TABLE
忽略表中存在的旧时间列并且不升级它们。
要升级包含此类临时列的表,请
avoid_temporal_upgrade
在执行之前禁用REPAIR TABLE
。
您可以REPAIR
TABLE
通过设置某些系统变量来提高性能。请参阅第 8.6.3 节,“优化 REPAIR TABLE 语句”。