本节讨论如何使用 myisamchk 对 MyISAM
表(扩展名 .MYI
和 .MYD
)进行操作。
您还可以使用 CHECK TABLE
和 REPAIR TABLE
语句检查和修复 MyISAM
表。参见 第 15.7.3.2 节,“CHECK TABLE 语句” 和 第 15.7.3.5 节,“REPAIR TABLE 语句”。
表损坏的症状包括查询意外中止以及以下可观察到的错误:
找不到文件
(错误代码: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 服务器在 mysqladmin 返回后仍然可用一段时间,直到所有语句处理都停止并且所有索引更改都已刷新到磁盘。
阶段 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
表示“快速恢复模式”)。这会尝试修复索引文件,而不会触碰数据文件。如果数据文件包含所有应有的内容,并且删除链接指向数据文件中的正确位置,则此方法应该有效,并且表将被修复。开始修复下一个表。否则,请使用以下步骤
在继续之前,请备份数据文件。
使用 myisamchk -r
tbl_name
(-r
表示“恢复模式”)。这会从数据文件中删除不正确的行和已删除的行,并重建索引文件。如果前面的步骤失败,请使用 myisamchk --safe-recover
tbl_name
。安全恢复模式使用一种旧的恢复方法,可以处理常规恢复模式无法处理的几种情况(但速度较慢)。
如果希望修复操作更快,则应在运行 myisamchk 时,将 sort_buffer_size
和 key_buffer_size
变量的值分别设置为可用内存的约 25%。
如果您在修复时遇到意外错误(例如 out of memory
错误),或者 myisamchk 崩溃,请转到阶段 3。
阶段 3:困难修复
只有在索引文件中的第一个 16KB 块被破坏或包含错误信息,或者索引文件丢失的情况下,才应该进入此阶段。在这种情况下,需要创建一个新的索引文件。操作方法如下
将数据文件移动到安全位置。
使用表描述文件创建新的(空的)数据和索引文件
$> mysql db_name
mysql> SET autocommit=1; mysql> TRUNCATE TABLE tbl_name; mysql> quit
将旧数据文件复制到新创建的数据文件上。(不要仅仅将旧文件移回新文件。您希望保留一份副本,以防出现问题。)
如果您使用的是复制,您应该在执行上述操作之前停止复制,因为这涉及文件系统操作,而这些操作不会被 MySQL 记录。
返回到阶段 2。 myisamchk -r -q 应该可以工作。(这应该不是一个无限循环。)
您也可以使用 REPAIR TABLE
SQL 语句,它会自动执行整个过程。当您使用 tbl_name
USE_FRMREPAIR TABLE
时,也不存在实用程序与服务器之间意外交互的可能性,因为服务器在您使用时会完成所有工作。参见 第 15.7.3.5 节,“REPAIR TABLE 语句”。