7.6.1 使用 myisamchk 进行崩溃恢复

本节介绍如何检查和处理 MySQL 数据库中的数据损坏。如果您的 table 经常损坏,则应尝试查找原因。参见第 B.4.3.3 节“如果 MySQLcontinue 崩溃该怎么办”

有关MyISAMtable 如何损坏的说明,请参见第 15.2.4 节“ MyISAMtable 问题”

如果在禁用外部锁定的情况下运行mysqld(这是默认设置),则当mysqld使用同一 table 时,将无法可靠地使用myisamchk检查 table。如果可以确定在运行myisamchk时没有人可以通过mysqld访问 table,则只需执行mysqladmin flush-tables即可开始检查 table。如果不能保证这一点,则在检查 table 时必须停止mysqld。如果您运行myisamchk来同时检查mysqld正在更新的 table,则可能会收到警告,指出即使 table 未损坏,该 table 也已损坏。

如果服务器在启用了外部锁定的情况下运行,则可以随时使用myisamchk检查 table。在这种情况下,如果服务器尝试更新myisamchk正在使用的 table,则服务器将 awaitmyisamchk完成后再 continue。

如果您使用myisamchk来修复或优化 table,则必须始终确保mysqld服务器未使用该 table(如果禁用了外部锁定,这也将适用)。如果不停止mysqld,则至少应先执行mysqladmin flush-tables,然后再运行myisamchk。如果服务器和myisamchk同时访问 table,则 table可能已损坏*。

执行崩溃恢复时,重要的是要了解数据库中的每个MyISAMtable* tbl_name *对应于下 table 中显示的数据库目录中的三个文件。

FilePurpose
tbl_name.frm定义(格式)文件
tbl_name.MYDData file
tbl_name.MYIIndex file

这三种文件类型中的每一种都以各种方式受到损坏,但是问题最常出现在数据文件和索引文件中。

myisamchk通过逐行创建.MYD数据文件的副本来工作。它通过删除旧的.MYD文件并将新文件重命名为原始文件名来结束修复阶段。如果使用--quick,则myisamchk不会创建临时.MYD文件,而是假定.MYD文件正确,并且仅生成新的索引文件而不触动.MYD文件。这是安全的,因为myisamchk自动检测.MYD文件是否已损坏并中止修复。您还可以为myisamchk两次指定--quick选项。在这种情况下,myisamchk不会因某些错误(例如重复键错误)而中止,而是尝试通过修改.MYD文件来解决它们。通常,只有在可用磁盘空间不足以进行正常修复的情况下,才使用两个--quick选项才有用。在这种情况下,至少应在运行myisamchk之前对 table 进行备份。