MySQL 8.4 Release Notes
18.2.4.2 表未正确关闭导致的问题
每个MyISAM
索引文件(.MYI
文件)都有一个头部计数器,可以用来检查表是否正确关闭。如果您从CHECK TABLE
或myisamchk收到警告,这意味着这个计数器已经出错:
clients are using or haven't closed the table properly
这条警告并不一定意味着表是损坏的,但至少应该检查一下表。
计数器工作如下:
-
第一次更新一个表时,索引文件头部的计数器将被递增。
-
在后续更新中,不会改变计数器。
-
当最后一个表实例关闭(因为执行了
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 实例”,了解更多讨论。