7.6.1 使用 myisamchk 进行崩溃恢复
本节介绍如何检查和处理 MySQL 数据库中的数据损坏。如果您的 table 经常损坏,则应尝试查找原因。参见第 B.4.3.3 节“如果 MySQLcontinue 崩溃该怎么办”。
有关MyISAM
table 如何损坏的说明,请参见第 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可能已损坏*。
执行崩溃恢复时,重要的是要了解数据库中的每个MyISAM
table* tbl_name
*对应于下 table 中显示的数据库目录中的三个文件。
File | Purpose |
---|---|
tbl_name.frm | 定义(格式)文件 |
tbl_name.MYD | Data file |
tbl_name.MYI | Index file |
这三种文件类型中的每一种都以各种方式受到损坏,但是问题最常出现在数据文件和索引文件中。
myisamchk通过逐行创建.MYD
数据文件的副本来工作。它通过删除旧的.MYD
文件并将新文件重命名为原始文件名来结束修复阶段。如果使用--quick,则myisamchk不会创建临时.MYD
文件,而是假定.MYD
文件正确,并且仅生成新的索引文件而不触动.MYD
文件。这是安全的,因为myisamchk自动检测.MYD
文件是否已损坏并中止修复。您还可以为myisamchk两次指定--quick选项。在这种情况下,myisamchk不会因某些错误(例如重复键错误)而中止,而是尝试通过修改.MYD
文件来解决它们。通常,只有在可用磁盘空间不足以进行正常修复的情况下,才使用两个--quick选项才有用。在这种情况下,至少应在运行myisamchk之前对 table 进行备份。