如何修复MyISAM表格

来自泡泡学习笔记
BrainBs讨论 | 贡献2023年7月25日 (二) 08:15的版本 (创建页面,内容为“本节中的讨论描述了如何在MyISAM表格(扩展名为.MYI和.MYD)上使用myisamchk。 您也可以使用CHECK TABLE和REPAIR TABLE语句来检查和修复MyISAM表格。 损坏表格的症状包括查询意外中止以及以下可观察到的错误: *无法找到文件tbl_name.MYI(错误代码:nnn) *文件意外结束 *记录文件已崩溃 *从表处理程序处获得错误nnn 为了获取有关错误的更多信息,请运行pe…”)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳到导航 跳到搜索

本节中的讨论描述了如何在MyISAM表格(扩展名为.MYI和.MYD)上使用myisamchk。


您也可以使用CHECK TABLE和REPAIR TABLE语句来检查和修复MyISAM表格。


损坏表格的症状包括查询意外中止以及以下可观察到的错误:

  • 无法找到文件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_ROWS和AVG_ROW_LENGTH表选项的值:
ALTER TABLE tbl_name MAX_ROWS=xxx AVG_ROW_LENGTH=yyy;


如果您不知道当前表选项的值,请使用SHOW CREATE TABLE命令。


对于其他错误,您需要修复表格。myisamchk通常可以检测和修复大多数出现的问题。


修复过程涉及多达三个阶段,如下所述。在开始之前,您应该切换到数据库目录并检查表格文件的权限。在Unix上,请确保它们可被mysqld运行的用户(以及您自己,因为您需要访问要检查的文件)读取。如果您需要修改文件,您还必须对其具有写入权限。


如果您要从命令行修复表格,您必须首先停止mysqld服务器。请注意,当您在远程服务器上运行mysqladmin shutdown命令时,mysqld服务器在mysqladmin返回后仍然可用一段时间,直到所有语句处理完毕并且所有索引更改都已刷新到磁盘上。


阶段1:检查表格

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


如果mysqld服务器已停止,您应该使用--update-state选项来告知myisamchk将表格标记为“checked”。


您只需要修复myisamchk报告错误的那些表格。对于这些表格,请进行第2阶段的操作。


如果在检查过程中遇到意外错误(例如内存不足错误),或者如果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%。


如果在修复过程中遇到意外错误(例如内存不足错误),或者如果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 tbl_name USE_FRM SQL语句,它会自动执行整个过程。此外,工具和服务器之间也不存在意外交互的可能性,因为在使用REPAIR TABLE时,服务器会完成所有工作。