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