本节介绍如何检查和处理 MySQL 数据库中的数据损坏。如果您的表经常损坏,您应该尝试找出原因。请参阅 第 B.3.3.3 节,“如果 MySQL 持续崩溃怎么办”。
有关MyISAM
表如何损坏的解释,请参阅第 15.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之前备份表。