top
Loading...
13.5.2.3.CHECKTABLE語法
13.5.2.3. CHECK TABLE語法
CHECK TABLE tbl_name [, tbl_name] ... [option] ...
 
option = {QUICK | FAST | MEDIUM | EXTENDED | CHANGED}

檢查一個或多個表是否有錯誤。CHECK TABLEMyISAMInnoDB表有作用。對于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, MEDIUMEXTENDED選項,則對于動態格式MyISAM表,默認檢查類型是MEDIUM。這與對表運行myisamchk --medium-check tbl_name的結果相同。對于靜態格式MyISAM表,默認檢查類型也是MEDIUM,除非CHANGEDFAST已被指定。在此情況下,默認值為QUICK。對于CHANGEDFAST,行掃描被跳過,因為行極少被破壞。

您可以組合檢查選項,如下面的例子所示。該例子對表進行了一個快速檢查,來查看該表是否被正確關閉:

CHECK TABLE test_table FAST QUICK;

注釋:在有些情況下,CHECK TABLE會更改表。如果表被標記為“corrupted”或“not closed properly”,則出現這種情況。但是CHECK TABLE不會找出表中的問題。在這種情況下,CHECK TABLE會把表標記為良好。

如果一個表被破壞,很有可能問題在索引中,而不在數據部分中。所有前述的檢查類型都可以徹底地檢查索引,因此,可以找出多數的錯誤。

如果您只想要檢查您假定的表是良好的,您應該不使用檢查選項或QUICK選項。當您時間匆忙時,應使用QUICKQUICK無法找出數據文件中的錯誤的風險非常小。(在多數情況下,在正常使用中,MySQL應能在數據文件中找出錯誤。如果找出了錯誤,表被標記為“corrupted”,并不能被使用,直到修復為止。)

如果您想要時常檢查表,FASTCHANGED多數情況下從原本中被使用(例如,從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以外的值。

作者:mysql.com
來源:http://dev.mysql.com/doc/refman/5.1/zh/sql-syntax.html
北斗有巢氏 有巢氏北斗