本节中的讨论描述了如何在表(扩展名和 )上使用 myisamchk。 MyISAM``.MYI``.MYD
您还可以使用CHECK TABLE andREPAIR TABLE语句来检查和修复MyISAM表。请参阅 第 13.7.3.2 节,“检查表语句”和 第 13.7.3.5 节,“修复表语句”。
损坏的表的症状包括意外中止的查询和可观察到的错误,例如:
- 找不到文件
*tbl_name*.MYI(ERRCODE:nnn) - 意外的文件结尾
- 记录文件崩溃
- *
nnn*表处理程序 出错
要获取有关错误的更多信息,请运行 perror nnn,其中 *nnn*是错误编号。以下示例显示如何使用perror查找指示表有问题的最常见错误编号的含义:
shell> 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运行的用户读取 (对你来说,因为你需要访问你正在检查的文件)。如果事实证明您需要修改文件,它们也必须是您可写的。
本节适用于表检查失败的情况(例如第 7.6.2 节“如何检查 MyISAM 表的错误”中描述的情况),或者您想使用myisamchk 提供的扩展功能。
用于表维护 的myisamchk选项在第 4.6.4 节“myisamchk — MyISAM 表维护实用程序”中描述。 myisamchk还具有您可以设置的变量来控制可能提高性能的内存分配。见 第 4.6.4.6 节,“myisamchk 内存使用”。
如果要从命令行修复表,必须先停止mysqld服务器。请注意,当您在远程服务器上执行mysqladmin shutdown时,mysqld服务器在mysqladmin返回后仍可使用一段时间,直到所有语句处理停止并且所有索引更改都已刷新到磁盘。
第 1 阶段:检查您的表
如果您有更多时间,请 运行myisamchk *.MYI或myisamchk -e *.MYI。使用 -s(silent) 选项抑制不必要的信息。
如果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 块被破坏或包含不正确的信息,或者索引文件丢失时,您才应该到达此阶段。在这种情况下,需要创建一个新的索引文件。请按以下步骤操作:
-
将数据文件移动到安全的地方。
-
使用表描述文件创建新的(空)数据和索引文件:
shell> mysql db_namemysql> SET autocommit=1; mysql> TRUNCATE TABLE tbl_name; mysql> quit -
将旧数据文件复制回新创建的数据文件。(不要只是将旧文件移回新文件。您希望保留副本以防出现问题。)
重要的
如果您正在使用复制,您应该在执行上述过程之前停止它,因为它涉及文件系统操作,而这些不会被 MySQL 记录。
回到第 2 阶段。myisamchk -r -q应该可以工作。(这不应该是一个无限循环。)
您还可以使用自动执行整个过程的SQL 语句。实用程序和服务器之间也不可能发生不需要的交互,因为当您使用. 见 第 13.7.3.5 节,“REPAIR TABLE 语句”。 REPAIR TABLE *tbl_name* USE_FRMREPAIR TABLE




