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