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