相关文档 下载此手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  如何修复 MyISAM 表

9.6.3 如何修复 MyISAM 表

本节讨论了如何使用 myisamchk 处理 MyISAM 表(扩展名为 .MYI.MYD)。

您也可以使用 CHECK TABLEREPAIR TABLE 语句来检查和修复 MyISAM 表。请参阅 第 15.7.3.2 节,“CHECK TABLE 语句”第 15.7.3.5 节,“REPAIR TABLE 语句”

损坏表的表现包括查询意外中止以及以下错误:

  • 找不到文件 tbl_name.MYI (错误代码:nnn)

  • 意外文件结束

  • 记录文件已损坏

  • 从表处理程序收到错误 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_ROWSAVG_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 *.MYImyisamchk -e *.MYI (如果您有更多时间)。使用 -s(静默)选项来抑制不必要的提示。

如果 mysqld 服务器已停止,则应使用 --update-state 选项来指示 myisamchk 将表标记为 已检查。

您只需要修复那些 myisamchk 宣布出现错误的表。对于这些表,请继续执行阶段 2。

如果在检查时出现意外错误(例如 内存不足 错误),或者 myisamchk 崩溃,请转到阶段 3。

阶段 2:简单的安全修复

首先,尝试 myisamchk -r -q tbl_name (-r -q 表示 快速恢复模式)。这将尝试修复索引文件而不接触数据文件。如果数据文件包含所有应该包含的内容并且删除链接指向数据文件中的正确位置,则此方法应该有效,并且表已修复。开始修复下一个表。否则,请使用以下步骤:

  1. 在继续之前备份数据文件。

  2. 使用 myisamchk -r tbl_name (-r 表示 恢复模式)。这将从数据文件中删除不正确的行和已删除的行,并重建索引文件。

  3. 如果前面的步骤失败,请使用 myisamchk --safe-recover tbl_name。安全恢复模式使用旧的恢复方法,该方法处理了一些常规恢复模式无法处理的情况(但速度较慢)。

注意

如果您希望修复操作更快,则在运行 myisamchk 时,应该将 sort_buffer_sizekey_buffer_size 变量的值分别设置为可用内存的约 25%。

如果在修复时出现意外错误(例如 内存不足 错误),或者 myisamchk 崩溃,请转到阶段 3。

阶段 3:困难修复

只有在索引文件中的前 16KB 块被破坏或包含不正确的信息,或者索引文件丢失的情况下,您才应该进入此阶段。在这种情况下,需要创建一个新的索引文件。请按以下步骤操作:

  1. 将数据文件移动到安全位置。

  2. 使用表描述文件来创建新的(空的)数据和索引文件

    $> mysql db_name
    mysql> SET autocommit=1;
    mysql> TRUNCATE TABLE tbl_name;
    mysql> quit
  3. 将旧数据文件复制到新创建的数据文件中。(不要只是将旧文件移回新文件。您希望保留一份副本,以防出现问题。)

重要

如果您正在使用复制,您应该在执行上述过程之前停止它,因为它涉及文件系统操作,而这些操作不会被 MySQL 记录。

返回到步骤 2。 myisamchk -r -q 应该可以工作。(这应该不是一个无限循环。)

您也可以使用 REPAIR TABLE tbl_name USE_FRM SQL 语句,它会自动执行整个过程。此外,当您使用 REPAIR TABLE 时,也不可能出现实用程序与服务器之间的意外交互,因为服务器会完成所有工作。请参阅 第 15.7.3.5 节,“REPAIR TABLE 语句”