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