### 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).