本节介绍如何检查和处理 MySQL 数据库中的数据损坏。如果您的表经常损坏,您应该尝试找到原因。参见 第 B.3.3.3 节,“如果 MySQL 持续崩溃该怎么办”.
有关 MyISAM
表如何损坏的说明,请参见 第 18.2.4 节,“MyISAM 表问题”.
如果您使用外部锁定禁用 (默认情况下) 运行 mysqld,则无法可靠地使用 myisamchk 检查 mysqld 正在使用的同一张表。如果您能确定在运行 myisamchk 时,没有人可以使用 mysqld 访问这些表,则您只需在开始检查表之前执行 mysqladmin flush-tables。如果您无法保证这一点,则必须在检查表时停止 mysqld。如果您运行 myisamchk 检查 mysqld 同时更新的表,您可能会收到关于表损坏的警告,即使它实际上没有损坏。
如果服务器使用外部锁定启用运行,您可以随时使用 myisamchk 检查表。在这种情况下,如果服务器尝试更新 myisamchk 正在使用的表,服务器会等待 myisamchk 完成后才继续。
如果您使用 myisamchk 修复或优化表,您必须始终确保 mysqld 服务器没有使用该表(即使外部锁定被禁用,这一点也适用)。如果您没有停止 mysqld,您至少应该在运行 myisamchk 之前执行 mysqladmin flush-tables。如果服务器和 myisamchk 同时访问表,您的表可能会损坏。
在执行崩溃恢复时,重要的是要理解数据库中的每个 MyISAM
表 tbl_name
都对应于数据库目录中的三个文件,如下表所示。
文件 | 目的 |
---|---|
|
数据文件 |
|
索引文件 |
这三种文件类型都可能以各种方式损坏,但问题最常出现在数据文件和索引文件中。
myisamchk 通过逐行创建 .MYD
数据文件的副本来工作。它通过删除旧的 .MYD
文件并将新文件重命名为原始文件名来结束修复阶段。如果您使用 --quick
,myisamchk 不会创建临时 .MYD
文件,而是假设 .MYD
文件是正确的,并且只生成一个新的索引文件,而不会触碰 .MYD
文件。这是安全的,因为 myisamchk 会自动检测 .MYD
文件是否已损坏,如果已损坏,则会中止修复。您还可以对 myisamchk 指定两次 --quick
选项。在这种情况下,myisamchk 不会因某些错误 (如重复键错误) 而中止,而是尝试通过修改 .MYD
文件来解决这些错误。通常,只有在您的可用磁盘空间太少而无法执行正常修复时,才使用两个 --quick
选项。在这种情况下,您至少应该在运行 myisamchk 之前备份表。