9.6.1 使用 myisamchk 进行崩溃恢复
本节描述了如何检查和处理 MySQL 数据库中的数据损坏。如果您的表格频繁地损坏,您应该尝试找到原因。请参阅第 B.3.3.3 节,“如果 MySQL 总是崩溃该怎么办”。
关于MyISAM
表格如何损坏的解释,请参阅第 18.2.4 节,“MyISAM 表格问题”。
如果您使用mysqld
命令(MySQL 服务器)时,外部锁定功能disabled(这是默认设置),那么在mysqld
正在使用同一个表时,您不能可靠地使用myisamchk
命令(MyISAM 表维护工具)来检查该表。如果您可以确定没有人可以使用mysqld
访问表,而您在运行myisamchk
时,您只需要执行mysqladmin flush-tables
命令,然后开始检查表。如果您不能确保这点,您必须停止mysqld
,然后再检查表。如果您使用myisamchk
命令来检查mysqld
正在更新的表,您可能会收到警告,指出该表是损坏的,但实际上它并不是。
如果服务器启用外部锁定,可以使用myisamchk在任何时候检查表。这种情况下,如果服务器尝试更新myisamchk正在使用的表,服务器将等待myisamchk完成后再继续。
如果您使用myisamchk修复或优化表,您必须始终确保mysqld服务器不使用该表(这也适用于外部锁定禁用)。如果您没有停止mysqld,至少在运行myisamchk之前执行mysqladmin flush-tables。如果服务器和myisamchk同时访问表,您的表可能会损坏。
在进行崩溃恢复时,需要了解每个MyISAM
表tbl__name
在数据库对应的三个文件,在以下表格中显示。
File | Purpose |
---|---|
|
数据文件 |
|
索引文件 |
这三个文件类型都可能会出现各种形式的损坏,但问题最常见的是在数据文件和索引文件中。
myisamchk通过将.MYD
数据文件逐行复制。它在修复阶段结束时,删除旧的.MYD
文件,并将新文件重命名为原始文件名称。如果您使用--quick
,myisamchk不会创建临时.MYD
文件,而是假设.MYD
文件正确,并且只生成新的索引文件,不会touch.MYD
文件。这是安全的,因为myisamchk自动检测.MYD文件是否损坏,并且在它是损坏时中止修复操作。您也可以指定--quick
选项两次,以便myisamchk在某些错误(如重复键错误)时不中止,而是尝试解决它们通过修改.MYD文件。文件。通常,使用两个--quick
选项只有在您没有足够的可用磁盘空间来执行正常修复时才有用。在这种情况下,您至少应该在运行myisamchk之前备份表。