Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


9.6.3 MyISAM 表修复

本节讨论如何使用myisamchk对MyISAM表(扩展名.MYI.MYD)进行维护。

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

MyISAM表损坏的症状包括查询突然中止和可观察到的错误,如下所示:

  • 无法找到文件tbl_name.MYI(Errcode: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 TABLEMAX_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服务器仍然可用一段时间,直到所有语句处理完成并且所有索引更改被写入磁盘为止。

Stage 1: 检查您的表

运行myisamchk *.MYImyisamchk -e *.MYI如果您有更多时间。使用-s(silent)选项来抑制不必要的信息。

如果停止了mysqld 服务器,您应该使用--update-state选项告诉myisamchk标记表格为已检查.

您只需要修复myisamchk报告错误的表格。对于这些表格,继续 Stage 2。

如果在检查时出现了意外错误(例如myisamchk崩溃),请转到 Stage 3。

Stage 2: 安全修复

首先,尝试myisamchk -r -q tbl_name-r -q表示“快速恢复模式”)。这将尝试修复索引文件,而不触摸数据文件。如果数据文件包含了它应该有的所有内容,并且删除链接指向正确的数据文件位置,这应该能够工作,表格将被修复。然后开始修复下一个表格。否则,请使用以下过程:

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

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

  3. 如果前一步骤失败,请使用myisamchk --safe-recover tbl_name。安全恢复模式使用旧的恢复方法,可以处理一些常规恢复模式不能处理的案例(但速度较慢)。

Note

如果您想使修复操作更快,您应该将sort_buffer_sizekey_buffer_size变量设置为大约可用内存的25%,在运行myisamchk时。

如果您在修复时遇到意外错误(例如out of memory错误),或myisamchk崩溃,请转到 Stage 3。

Stage 3: 困难修复

只有在索引文件的第一个16KB块被破坏或包含错误信息,或者索引文件丢失时,您才能到达这个阶段。在这种情况下,需要创建新的索引文件。请按照以下步骤操作:

  1. 将数据文件移到安全的地方。

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

    $> mysql db_name
    mysql> SET autocommit=1;
    mysql> TRUNCATE TABLE tbl_name;
    mysql> quit
  3. 将旧的数据文件复制回新创建的数据文件中。不要简单地将旧文件移动到新文件上,您想要保留一个副本,以便在出现问题时可以恢复。

Important

如果您使用了 replication,建议在执行以下过程之前停止它,因为该过程涉及文件系统操作,这些操作不被 MySQL 记录。

返回 Stage 2。使用myisamchk -r -q应该可以工作。(这 shouldn't be an endless loop。)

您也可以使用以下 SQL 语句来自动执行整个过程:REPAIR TABLE tbl_name USE_ FRM。在使用REPAIR TABLE时,服务器将执行所有工作,没有可能出现不想要的交互,因为服务器在您使用Section&nbs