15.2.4.2 table 中的问题未正确关闭

每个MyISAM索引文件(.MYI文件)在 Headers 中都有一个计数器,该计数器可用于检查 table 是否已正确关闭。如果您从CHECK TABLEmyisamchk收到以下警告,则 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 的其他进程进行交互时出现问题,如果计数器为零,则在关闭时计数器不会递减。

换句话说,只有在以下情况下,计数器才会变得不正确:

  • 复制MyISAMtable 而无需先发出LOCK TABLESFLUSH TABLES

  • MySQL 在更新和最终关闭之间崩溃了。 (该 table 可能仍然可以,因为 MySQL 总是在每个语句之间发布所有内容的写操作.)

  • mysqld使用 table 的同时myisamchk --recovermyisamchk --update-state修改了该 table。

  • 多台mysqld服务器正在使用该 table,而另一台服务器正在使用该 table 时,一台服务器在该 table 上执行了REPAIR TABLECHECK TABLE。在此设置中,使用CHECK TABLE是安全的,尽管您可能会从其他服务器收到警告。但是,应避免使用REPAIR TABLE,因为当一台服务器用新服务器替换数据文件时,其他服务器不知道。

通常,在多个服务器之间共享数据目录是一个坏主意。有关其他讨论,请参见第 5.7 节“在一台机器上运行多个 MySQL 实例”