CHECK TABLE tbl_name [, tbl_name] ... [option] ...
option = {QUICK | FAST | MEDIUM | EXTENDED | CHANGED}
檢查一個或多個表是否有錯誤。CHECK TABLE對MyISAM和InnoDB表有作用。對于MyISAM表,關鍵字統計數據被更新。
CHECK TABLE也可以檢查視圖是否有錯誤,比如在視圖定義中被引用的表已不存在。
CHECK TABLE語句會返回一個含有以下列的表:
列 |
值 |
Table |
表名稱 |
Op |
進行檢查 |
Msg_type |
狀態、錯誤、信息或錯誤之一 |
Msg_text |
消息 |
注意,該語句可能會為每個被檢查的表產生多行信息。最后一行有一個Msg_type狀態值。Msg_text通常應為OK。如果您沒有得到OK,或表已經更新了,則您通常應該運行修復后的表。請參見5.9.4節,“表維護和崩潰恢復”。表已經更新了,這意味著表的存儲引擎指示沒有必要檢查表。
可以給予的不同的檢查選項列于下表中。這些選項只適用于檢查MyISAM表。對于InnoDB表和視圖,這些選項被忽略。
類型 |
意義 |
QUICK |
不掃描行,不檢查錯誤的鏈接。 |
FAST |
只檢查沒有被正確關閉的表。 |
CHANGED |
只檢查上次檢查后被更改的表,和沒有被正確關閉的表。 |
MEDIUM |
掃描行,以驗證被刪除的鏈接是有效的。也可以計算各行的關鍵字校驗和,并使用計算出的校驗和驗證這一點。 |
EXTENDED |
對每行的所有關鍵字進行一個全面的關鍵字查找。這可以確保表是100%一致的,但是花的時間較長。 |
如果沒有指定QUICK, MEDIUM或EXTENDED選項,則對于動態格式MyISAM表,默認檢查類型是MEDIUM。這與對表運行myisamchk --medium-check tbl_name的結果相同。對于靜態格式MyISAM表,默認檢查類型也是MEDIUM,除非CHANGED或FAST已被指定。在此情況下,默認值為QUICK。對于CHANGED和FAST,行掃描被跳過,因為行極少被破壞。
您可以組合檢查選項,如下面的例子所示。該例子對表進行了一個快速檢查,來查看該表是否被正確關閉:
CHECK TABLE test_table FAST QUICK;
注釋:在有些情況下,CHECK TABLE會更改表。如果表被標記為“corrupted”或“not closed properly”,則出現這種情況。但是CHECK TABLE不會找出表中的問題。在這種情況下,CHECK TABLE會把表標記為良好。
如果一個表被破壞,很有可能問題在索引中,而不在數據部分中。所有前述的檢查類型都可以徹底地檢查索引,因此,可以找出多數的錯誤。
如果您只想要檢查您假定的表是良好的,您應該不使用檢查選項或QUICK選項。當您時間匆忙時,應使用QUICK。QUICK無法找出數據文件中的錯誤的風險非常小。(在多數情況下,在正常使用中,MySQL應能在數據文件中找出錯誤。如果找出了錯誤,表被標記為“corrupted”,并不能被使用,直到修復為止。)
如果您想要時常檢查表,FAST和CHANGED多數情況下從原本中被使用(例如,從cron中被執行)。在多數情況下,FAST優先于CHANGED。(只有一種情況FAST不優先于CHANGED,那就是當您懷疑您在MyISAM代碼中發現了錯誤。)
當MySQL試圖通過關鍵字更新一行或查找一行時,如果您已經運行了一個常規檢查后但仍得到來自表的奇怪的錯誤,此時使用EXTENDED。(如果常規的檢查運行成功,則基本用不著EXTENDED。)
被CHECK TABLE報告的部分問題不會被自動修正:
· 發現行。此行中,auto_increment列有0值。
這意味著,您在表中有一行,該行的AUTO_INCREMENT索引列包含0值。(可以通過使用UPDATE語句,明確地把列設置為0,以創建一個AUTO_INCREMENT列為0的行。)
這本身不是一個錯誤,但是如果您決定轉儲表并恢復表,或對表進行ALTER TABLE,那么會導致出現麻煩。在此情況下,AUTO_INCREMENT列會根據AUTO_INCREMENT列的結果更改值,這會導致出現問題,如重復關鍵字錯誤等。
要消除警告,只需執行一個UPDATE語句,把列設置為除0以外的值。