### 7.6.1 使用 myisamchk 进行崩溃恢复

[](<>)[](<>)[](<>)[](<>)

本节介绍如何检查和处理 MySQL 数据库中的数据损坏。如果您的表经常损坏，您应该尝试找出原因。看[第 B.3.3.3 节，“如果 MySQL 不断崩溃怎么办”](crashing.html).

有关如何解释`MyISAM`表可能会损坏，请参阅[第 16.2.4 节，“MyISAM 表问题”](myisam-table-problems.html).

如果你跑[**mysqld**](mysqld.html)禁用外部锁定（这是默认设置），您不能可靠地使用[**迈萨姆奇克**](myisamchk.html)检查表时[**mysqld**](mysqld.html)正在使用同一张桌子。如果您可以确定没有人可以使用[**mysqld**](mysqld.html)当你跑步时[**迈萨姆奇克**](myisamchk.html), 你只需要执行[**mysqladmin 刷新表**](mysqladmin.html)在您开始检查表格之前。如果你不能保证这一点，你必须停止[**mysqld**](mysqld.html)当您检查表格时。如果你跑[**迈萨姆奇克**](myisamchk.html)检查表[**mysqld**](mysqld.html)同时更新时，您可能会收到警告说表已损坏，即使它没有损坏。

如果服务器在启用外部锁定的情况下运行，您可以使用[**迈萨姆奇克**](myisamchk.html)随时查看表格。在这种情况下，如果服务器尝试更新一个表[**迈萨姆奇克**](myisamchk.html)正在使用，服务器等待[**迈萨姆奇克**](myisamchk.html)在它继续之前完成。

如果你使用[**迈萨姆奇克**](myisamchk.html)要修复或优化表，您*必须*始终确保[**mysqld**](mysqld.html)服务器未使用该表（如果禁用了外部锁定，这也适用）。如果你不停[**mysqld**](mysqld.html)，你至少应该做一个[**mysqladmin 刷新表**](mysqladmin.html)在你跑步之前[**迈萨姆奇克**](myisamchk.html).你的桌子*可能会损坏*如果服务器和[**迈萨姆奇克**](myisamchk.html)同时访问表。

在执行崩溃恢复时，重要的是要了解每个`MyISAM`桌子*`tbl_name`*在一个数据库中对应于下表所示数据库目录中的三个文件。

| 文件 | 目的 |
| --- | --- |
| `*`tbl_name`*.MYD` | 数据文件 |
| `*`tbl_name`*。我的我` | 索引文件 |

这三种文件类型中的每一种都以各种方式受到损坏，但问题最常发生在数据文件和索引文件中。

[**迈萨姆奇克**](myisamchk.html)通过创建副本来工作`.MYD`数据文件逐行。它通过移除旧的来结束修复阶段`.MYD`文件并将新文件重命名为原始文件名。如果你使用[`- 快的`](myisamchk-repair-options.html#option_myisamchk_quick),[**迈萨姆奇克**](myisamchk.html)不创建临时`.MYD`文件，而是假设`.MYD`文件是正确的并且只生成一个新的索引文件而不接触`.MYD`文件。这是安全的，因为[**迈萨姆奇克**](myisamchk.html)自动检测是否`.MYD`文件已损坏，如果是，则中止修复。您还可以指定[`- 快的`](myisamchk-repair-options.html#option_myisamchk_quick)选项两次[**迈萨姆奇克**](myisamchk.html).在这种情况下，[**迈萨姆奇克**](myisamchk.html)不会中止某些错误（例如重复键错误），而是尝试通过修改`.MYD`文件。通常使用两个[`- 快的`](myisamchk-repair-options.html#option_myisamchk_quick)仅当可用磁盘空间太少而无法执行正常修复时，选项才有用。在这种情况下，您至少应该在运行之前对表进行备份[**迈萨姆奇克**](myisamchk.html).
