15.7.3.5 修复表语句
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不断崩溃”,和第18.2.4节,“MyISAM表问题”。
REPAIR TABLE
检查表是否需要升级,如果需要,它将执行升级,遵循CHECK TABLE ... FOR UPGRADE
的规则。请参阅第15.7.3.2节,“CHECK TABLE语句”,了解更多信息。
-
在执行表修复操作前,请先备份表;在某些情况下,操作可能会导致数据丢失。可能的原因包括文件系统错误。请参阅第9章,“备份和恢复”。
-
如果服务器在执行
REPAIR TABLE
操作时崩溃,重启服务器后,必须立即执行另一个REPAIR TABLE
语句,以便访问该表。否则,在最坏的情况下,你可能会损坏数据文件,而下一个操作可能会覆盖数据文件。这是一个不太可能的但可能的场景,这也强调了备份的重要性。 -
如果源表损坏,并且你运行
REPAIR TABLE
语句,那么对原始表的任何更改将不会传播到副本中。
REPAIR TABLE 存储引擎和分区支持
REPAIR TABLE
可以用于MyISAM
、ARCHIVE
和CSV
表。对于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_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
索引文件丢失或头部损坏时使用。如果.MYI
文件头部信息不可靠,MySQL将使用数据字典中的信息重新创建它。这类修复操作不能使用myisamchk.Caution使用
USE_FRM
选项仅在无法使用常规REPAIR
模式时。将服务器忽略.MYI
文件会使得表元数据不可用,这可能会产生不良后果:-
当前的
AUTO_INCREMENT
值将被丢失。 -
表中的链接记录将被丢失,这意味着删除记录的空闲空间将无法被释放。
-
.MYI
头部指示表是否压缩。如果服务器忽略这个信息,无法确定表是否压缩,修复操作可能会改变或丢失表内容。这意味着USE_FRM
不应该与压缩表一起使用。实际上,这也不是必要的,因为压缩表是只读的,不能变得 corrupt。
如果使用
USE_FRM
对一个由不同版本的 MySQL 服务器创建的表,REPAIR TABLE
将不尝试修复该表。在这种情况下,REPAIR TABLE
返回的结果集包含一行具有Msg_type
值为error
和Msg_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
值为status
,Msg_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格式,即TIME
、DATETIME
和TIMESTAMP
列缺乏秒精度支持。