每個 MyISAM
索引檔案(.MYI
檔案)的標頭中都有一個計數器,可用於檢查表格是否已正確關閉。如果您從 CHECK TABLE
或 myisamchk 收到以下警告,表示此計數器已不同步
clients are using or haven't closed the table properly
此警告不一定表示表格已損毀,但您至少應該檢查表格。
計數器的工作方式如下
第一次在 MySQL 中更新表格時,索引檔案標頭中的計數器會遞增。
在後續更新期間不會變更計數器。
當表格的最後一個實例關閉時(因為執行了
FLUSH TABLES
操作,或因為表格快取中沒有空間),如果表格在任何時候更新過,則計數器會遞減。當您修復表格或檢查表格,並發現表格正常時,計數器會重設為零。
為了避免與可能檢查表格的其他進程發生互動問題,如果計數器為零,則在關閉時不會遞減。
換句話說,計數器只有在下列情況下才會變得不正確
在未先發出
LOCK TABLES
和FLUSH TABLES
的情況下,複製MyISAM
表格。MySQL 在更新和最終關閉之間當機。(表格可能仍然正常,因為 MySQL 總是在每個陳述式之間發出所有內容的寫入。)
表格在 myisamchk --recover 或 myisamchk --update-state 修改的同時,mysqld 正在使用。
多個 mysqld 伺服器正在使用表格,且其中一個伺服器在另一個伺服器使用表格時,對表格執行了
REPAIR TABLE
或CHECK TABLE
。在此設定中,使用CHECK TABLE
是安全的,儘管您可能會從其他伺服器收到警告。然而,應避免使用REPAIR TABLE
,因為當一個伺服器以新的資料檔案取代時,其他伺服器並不知道這一點。一般而言,在多個伺服器之間共用資料目錄並不是一個好主意。請參閱 第 7.8 節,「在單一機器上執行多個 MySQL 執行個體」,以取得更多討論。