每個MyISAM索引文件(.MYI)在頭有一個計數器,它可以被用來檢查一個表是否被恰當地關閉。如果你從CHECK TABLE或myisamchk得到下列警告,意味著這個計數器已經不同步了:
clIEnts are using or haven't closed the table proPerly
這個警告並不是完全意味著表已被破壞,但你至少應該檢查表。
計數器的工作方式如下:
· 表在MySQL中第一次被更新,索引文件頭的計數器加一。
· 在未來的更新中,計數器不被改變。
· 當表的最後實例被關閉(因為一個操作FLUSH TABLE或因為在表緩沖區中沒有空間)之時,若表已經在任何點被更新,則計數器減一。
· 當你修理或檢查表並且發現表完好之時,計數器被重置為零。
· 要避免與其它可能檢查表的進程進行事務的問題,若計數器為零,在關閉時計數器不減一。
換句話來說,計數器只有在下列情況會不同步:
· MyISAM表不隨第一次發出的LOCK TABLES和FLUSH TABLES被復制。
· MySQL在一次更新和最後關閉之間崩潰(注意,表可能依然完好,因為MySQL總是在每個語句之間為每件事發出寫操作)。
· 一個表被myisamchk --recover或myisamchk --update-state修改,同時被MySQLd使用。
· 多個MySQLd服務器正使用表,並且一個服務器在一個表上執行REPAIR TABLE或CHECK TABLE,同時該表也被另一個服務器使用。在這個結構中,使用CHECK TABLE是安全的,雖然你可能從其它服務器上得到警告。盡管如此,REPAIR TABLE應該被避免,因為當一個服務器用一個新的數據文件替代舊的之時,這並沒有發送信號到其它服務器上。
總的來說,在多服務器之間分享一個數據目錄是一個壞主意。