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