本节介绍如何检查和处理 MySQL 数据库中的数据损坏。如果您的表经常损坏,您应该尝试找出原因。请参见第 B.3.3.3 节,“如果 MySQL 持续崩溃该怎么办”.
有关 MyISAM
表如何损坏的说明,请参见第 18.2.4 节,“MyISAM 表问题”.
如果您运行 mysqld 并禁用外部锁定(这是默认设置),则在 mysqld 使用同一张表时,无法可靠地使用 myisamchk 检查该表。如果您能确定在运行 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 之前备份该表。