本节讨论如何使用 myisamchk 对 MyISAM
表(扩展名 .MYI
和 .MYD
)进行维护。
您也可以使用 CHECK TABLE
和 REPAIR TABLE
语句来检查和修复 MyISAM
表。请参阅 第 15.7.3.2 节,“CHECK TABLE 语句” 和 第 15.7.3.5 节,“REPAIR TABLE 语句”。
表损坏的症状包括查询意外中止和可观察到的错误,如下所示:
-
无法找到文件
(Errcode:tbl_name
.MYInnn
) -
意外的文件结尾
-
记录文件崩溃
-
从表处理程序获取错误
nnn
要获取更多关于错误的信息,请运行 perror nnn
,其中 nnn
是错误号。以下示例显示如何使用 perror 查找最常见的错误号的含义:
$> perror 126 127 132 134 135 136 141 144 145
MySQL error code 126 = Index file is crashed
MySQL error code 127 = Record-file is crashed
MySQL error code 132 = Old database file
MySQL error code 134 = Record was already deleted (or record file crashed)
MySQL error code 135 = No more room in record file
MySQL error code 136 = No more room in index file
MySQL error code 141 = Duplicate unique key or constraint on write or update
MySQL error code 144 = Table is crashed and last repair failed
MySQL error code 145 = Table was marked as crashed and should be repaired
注意,错误 135(记录文件没有更多空间)和错误 136(索引文件没有更多空间)不是可以通过简单修复解决的问题。在这种情况下,您必须使用 ALTER TABLE
增加表选项 MAX_ROWS
和 AVG_ROW_LENGTH
的值:
ALTER TABLE tbl_name MAX_ROWS=xxx AVG_ROW_LENGTH=yyy;
如果您不知道当前表选项的值,请使用 SHOW CREATE TABLE
。
对于其他错误,您必须修复您的表。myisamchk 通常可以检测和修复大多数问题。
修复过程涉及到三个阶段,下面将对其进行描述。在开始之前,您应该更改到数据库目录并检查表文件的权限。在 Unix 上,确保它们可以被 mysqld 运行的用户(和您,因为您需要访问您正在检查的文件)读取。如果您需要修改文件,它们也必须可以被您写入。
本节适用于表检查失败的情况(例如 第 9.6.2 节,“如何检查 MyISAM 表错误” 中所述),或您想使用 myisamchk 提供的扩展功能。
用于表维护的 myisamchk 选项在 第 6.6.4 节,“myisamchk — MyISAM 表维护实用程序” 中进行了描述。myisamchk 也有可以设置的变量,以控制内存分配,这可能会提高性能。请参阅 第 6.6.4.6 节,“myisamchk 内存使用”。
如果您要从命令行修复表格,必须首先停止mysqld服务器。注意,当您在远程服务器上执行mysqladmin shutdown时,mysqld服务器仍然可用一段时间,直到所有语句处理停止并且所有索引更改被刷新到磁盘。
阶段1:检查表格
运行myisamchk *.MYI或myisamchk -e *.MYI,如果您有更多时间。使用-s
(沉默)选项来抑制不必要的信息。
如果mysqld服务器已停止,您应该使用--update-state
选项告诉myisamchk将表格标记为“已检查。”
您只需要修复myisamchk报告错误的那些表格。对于这些表格,继续执行阶段2。
如果您在检查时遇到意外错误(例如out of memory
错误),或myisamchk崩溃,请转到阶段3。
阶段2:简单安全修复
首先,尝试myisamchk -r -q tbl_name
(-r -q
表示“快速恢复模式”)。这尝试在不touch数据文件的情况下修复索引文件。如果数据文件包含所有应该包含的内容,并且删除链接指向数据文件中的正确位置,这应该起作用,并且表格将被修复。然后,开始修复下一个表格。否则,请使用以下过程:
-
在继续之前,备份数据文件。
-
使用myisamchk -r
tbl_name
(-r
表示“恢复模式”)。这将从数据文件中删除不正确的行和已删除的行,并重建索引文件。 -
如果前一步骤失败,请使用myisamchk --safe-recover
tbl_name
。安全恢复模式使用旧的恢复方法来处理一些常规恢复模式无法处理的情况(但速度较慢)。
如果您想让修复操作速度更快,您应该将sort_buffer_size
和key_buffer_size
变量的值分别设置为可用内存的25%,以便在运行myisamchk时。
如果您在修复时遇到意外错误(例如out of memory
错误),或myisamchk崩溃,请转到阶段3。
阶段3:困难修复
您应该只有在索引文件的第一个16KB块被破坏或包含不正确的信息,或者索引文件丢失时,才会达到这个阶段。在这种情况下,需要创建一个新的索引文件。按照以下步骤进行:
-
将数据文件移到安全的地方。
-
使用表格描述文件创建新的(空)数据和索引文件:
$> mysql db_name
mysql> SET autocommit=1; mysql> TRUNCATE TABLE tbl_name; mysql> quit
-
将旧数据文件复制回新创建的数据文件上。(不要只是将旧文件移到新文件上。您想保留一个副本,以防止出现问题。)
如果您正在使用复制,请在执行上述过程之前停止它,因为它涉及文件系统操作,而这些操作不会被 MySQL 记录。
返回 Stage 2。myisamchk -r -q 应该有效。(这不应该是一个无限循环。)
您也可以使用 REPAIR TABLE
SQL 语句,该语句将自动执行整个过程。此外,当您使用 tbl_name
USE_FRMREPAIR TABLE
时,不会出现实用程序和服务器之间的不良交互,因为服务器执行所有工作。请参阅 第 15.7.3.5 节,“REPAIR TABLE 语句”。