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