每个 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 实例”。