每个 MyISAM
索引文件 (.MYI
文件) 的头部都有一个计数器,可用于检查表是否已正确关闭。如果您从 CHECK TABLE
或 myisamchk 中获得以下警告,则表示该计数器已不同步
clients are using or haven't closed the table properly
此警告并不一定意味着表已损坏,但您至少应该检查表。
计数器的作用如下
第一次在 MySQL 中更新表时,索引文件头部的计数器会递增。
在后续更新中,计数器不会改变。
当表的最后一个实例关闭时(因为执行了
FLUSH TABLES
操作,或者因为表缓存中没有空间),如果表在任何时间点都已更新,则计数器会递减。当您修复表或检查表并发现表正常时,计数器将重置为零。
为了避免与可能检查表的其他进程交互时出现问题,如果计数器为零,则在关闭时不会递减。
换句话说,只有在以下情况下,计数器才会变得不正确
在发出
LOCK TABLES
和FLUSH TABLES
之前复制了MyISAM
表。在更新和最终关闭之间,MySQL 已崩溃。(表可能仍然正常,因为 MySQL 始终会在每个语句之间为所有内容发出写入。)
表被 myisamchk --recover 或 myisamchk --update-state 修改,同时该表正在被 mysqld 使用。
多个 mysqld 服务器正在使用该表,一个服务器对该表执行了
REPAIR TABLE
或CHECK TABLE
,而该表正在被另一个服务器使用。在此设置中,使用CHECK TABLE
是安全的,尽管您可能会从其他服务器收到警告。但是,应避免使用REPAIR TABLE
,因为当一个服务器用新文件替换数据文件时,其他服务器并不知道此事。通常,在多个服务器之间共享数据目录不是一个好主意。有关更多讨论,请参见 第 7.8 节,“在一台机器上运行多个 MySQL 实例”。