CHECK TABLE tbl_name [, tbl_name] ... [option] ...
option: {
FOR UPGRADE
| QUICK
| FAST
| MEDIUM
| EXTENDED
| CHANGED
}
CHECK TABLE 檢查資料表是否有錯誤。 CHECK TABLE 也可以檢查檢視表是否有問題,例如檢視表定義中參考的資料表不再存在。
要檢查資料表,您必須擁有該資料表的某些權限。
CHECK TABLE 適用於 InnoDB、MyISAM、ARCHIVE 和 CSV 資料表。
在 InnoDB 資料表上執行 CHECK TABLE 之前,請參閱 InnoDB 資料表的 CHECK TABLE 使用注意事項。
CHECK TABLE 支援分割資料表,您可以使用 ALTER TABLE ... CHECK PARTITION 來檢查一個或多個分割區;有關詳細資訊,請參閱第 15.1.9 節,「ALTER TABLE 陳述式」和第 26.3.4 節,「分割區維護」。
CHECK TABLE 會忽略未建立索引的虛擬產生欄位。
CHECK TABLE 會傳回結果集,其中包含下表所示的欄位。
| 欄位 | 值 |
|---|---|
資料表 |
資料表名稱 |
Op |
一律為 check |
Msg_type |
status、error、info、note 或 warning |
Msg_text |
資訊訊息 |
此陳述式可能會針對每個檢查的資料表產生多行資訊。最後一行的 Msg_type 值為 status,Msg_text 通常應為 OK。Table is already up to date 表示資料表的儲存引擎指出不需要檢查資料表。
FOR UPGRADE 選項會檢查具名的資料表是否與目前的 MySQL 版本相容。使用 FOR UPGRADE,伺服器會檢查每個資料表,以判斷自建立資料表以來,資料表的任何資料類型或索引是否發生任何不相容的變更。如果沒有,檢查即會成功。否則,如果可能出現不相容的情況,伺服器會對資料表執行完整檢查 (可能需要一些時間)。
不相容的情況可能會發生,因為資料類型的儲存格式已變更,或其排序順序已變更。我們的目標是避免這些變更,但偶爾為了修正比版本之間的不相容性更嚴重的問題,這些變更是有其必要性。
FOR UPGRADE 會發現這些不相容的情況
TEXT欄位中InnoDB和MyISAM資料表的尾隨空格索引順序在 MySQL 4.1 和 5.0 之間有所變更。新的
DECIMAL資料類型的儲存方法在 MySQL 5.0.3 和 5.0.5 之間有所變更。有時會對字元集或定序進行變更,這需要重建資料表索引。有關此類變更的詳細資訊,請參閱第 3.5 節,「MySQL 9.0 的變更」。有關重建資料表的資訊,請參閱第 3.14 節,「重建或修復資料表或索引」。
MySQL 9.0 不支援舊版 MySQL 中允許的 2 位數
YEAR(2)資料類型。對於包含YEAR(2)欄位的資料表,CHECK TABLE會建議使用REPAIR TABLE,這會將 2 位數YEAR(2)欄位轉換為 4 位數YEAR欄位。會維護觸發建立時間。
如果資料表包含 5.6.4 版之前的舊時間欄位格式 (不支援小數秒精度的
TIME、DATETIME和TIMESTAMP欄位),則會將資料表回報為需要重建。這有助於 MySQL 升級程序偵測和升級包含舊時間欄位的資料表。針對使用非原生分割的資料表會發出警告,因為 MySQL 9.0 中已移除非原生分割。請參閱第 26 章,《分割》。
下表顯示可以提供的其他檢查選項。這些選項會傳遞至儲存引擎,該引擎可以使用或忽略它們。
| 類型 | 意義 |
|---|---|
QUICK |
不掃描資料列以檢查不正確的連結。適用於 InnoDB 和 MyISAM 資料表和檢視表。 |
FAST |
僅檢查未正確關閉的資料表。InnoDB 會忽略此選項;僅適用於 MyISAM 資料表和檢視表。 |
CHANGED |
僅檢查自上次檢查以來已變更或未正確關閉的資料表。InnoDB 會忽略此選項;僅適用於 MyISAM 資料表和檢視表。 |
MEDIUM |
掃描資料列以驗證已刪除的連結是否有效。這也會計算資料列的索引鍵校驗和,並使用索引鍵的計算校驗和來驗證此校驗和。InnoDB 會忽略此選項;僅適用於 MyISAM 資料表和檢視表。 |
EXTENDED |
針對每個資料列的所有索引鍵執行完整的索引鍵查閱。這可確保資料表 100% 一致,但需要很長時間。InnoDB 會忽略此選項;僅適用於 MyISAM 資料表和檢視表。 |
您可以合併檢查選項,如下列範例所示,該範例會對資料表執行快速檢查,以判斷其是否已正確關閉
CHECK TABLE test_table FAST QUICK;
如果 CHECK TABLE 在標記為 「已損毀」或 「未正確關閉」的資料表中找不到任何問題,CHECK TABLE 可以移除該標記。
如果資料表損毀,問題很可能出在索引中,而不是資料部分。所有上述檢查類型都會徹底檢查索引,因此應該會發現大多數錯誤。
若要檢查您認為沒問題的資料表,請勿使用任何檢查選項或 QUICK 選項。當您趕時間並且可以承擔 QUICK 未在資料檔案中找到錯誤的極小風險時,應該使用後者。(在大多數情況下,在正常使用情況下,MySQL 應該會在資料檔案中找到任何錯誤。如果發生這種情況,資料表會被標記為 「已損毀」,並且在修復之前無法使用。)
FAST 和 CHANGED 主要用於從指令碼 (例如,從 cron 執行) 定期檢查資料表。在大多數情況下,FAST 比 CHANGED 更可取。(只有在您懷疑在 MyISAM 程式碼中發現錯誤時,才會不建議使用。)
只有在您執行正常檢查後,當 MySQL 嘗試更新資料列或依索引鍵尋找資料列時,仍然從資料表收到錯誤時,才應使用 EXTENDED。如果正常檢查成功,則這種情況不太可能發生。
使用 CHECK TABLE ... EXTENDED 可能會影響查詢最佳化工具產生的執行計畫。
CHECK TABLE 報告的某些問題無法自動修正
發現自動遞增欄位的值為 0 的資料列.這表示您的表格中有一列的
AUTO_INCREMENT索引欄位包含值 0。(您可以使用UPDATE陳述式將欄位明確設定為 0,來建立AUTO_INCREMENT欄位為 0 的列。)這本身並非錯誤,但如果您決定傾印表格並還原,或對表格執行
ALTER TABLE,可能會造成問題。在這種情況下,AUTO_INCREMENT欄位的值會根據AUTO_INCREMENT欄位的規則變更,這可能會導致重複鍵錯誤等問題。若要移除警告,請執行
UPDATE陳述式,將欄位設定為 0 以外的其他值。
以下注意事項適用於 InnoDB 表格
如果
CHECK TABLE遇到損毀的頁面,伺服器會結束以防止錯誤傳播 (錯誤 #10132)。如果損毀發生在次要索引中,但表格資料可讀取,執行CHECK TABLE仍可能導致伺服器結束。如果
CHECK TABLE在叢集索引中遇到損毀的DB_TRX_ID或DB_ROLL_PTR欄位,CHECK TABLE可能會導致InnoDB存取無效的復原日誌記錄,進而導致與 MVCC 相關的伺服器結束。如果
CHECK TABLE在InnoDB表格或索引中遇到錯誤,它會回報錯誤,並且通常會將索引標記為損毀,有時也會將表格標記為損毀,防止進一步使用該索引或表格。這些錯誤包括次要索引中的條目數量不正確或連結不正確。如果
CHECK TABLE在次要索引中發現條目數量不正確,它會回報錯誤,但不會導致伺服器結束或阻止存取檔案。CHECK TABLE會檢視索引頁面結構,然後檢視每個索引鍵條目。它不會驗證索引鍵指標指向叢集記錄,也不會追蹤BLOB指標的路徑。當
InnoDB表格儲存在自己的.ibd檔案中時,.ibd檔案的前 3 個頁面包含標頭資訊,而不是表格或索引資料。CHECK TABLE陳述式不會偵測僅影響標頭資料的不一致性。若要驗證InnoDB.ibd檔案的整個內容,請使用 innochecksum 命令。在大型
InnoDB表格上執行CHECK TABLE時,其他執行緒可能會在CHECK TABLE執行期間遭到封鎖。為了避免逾時,CHECK TABLE操作的號誌等待臨界值 (600 秒) 會延長 2 小時 (7200 秒)。如果InnoDB偵測到 240 秒或更長時間的號誌等待,它會開始將InnoDB監控輸出列印到錯誤日誌。如果鎖定要求超出號誌等待臨界值,InnoDB會中止程序。為了完全避免發生號誌等待逾時的可能性,請執行CHECK TABLE QUICK,而不是CHECK TABLE。CHECK TABLE對於InnoDBSPATIAL索引的功能包括 R 樹狀結構有效性檢查,以及檢查以確保 R 樹狀結構列計數與叢集索引相符。CHECK TABLE支援虛擬產生欄位的次要索引,這些欄位由InnoDB支援。InnoDB支援平行叢集索引讀取,這可以提升CHECK TABLE的效能。InnoDB在CHECK TABLE操作期間會讀取叢集索引兩次。第二次讀取可以平行執行。必須將innodb_parallel_read_threads工作階段變數設定為大於 1 的值,才會發生平行叢集索引讀取。用來執行平行叢集索引讀取的實際執行緒數,取決於innodb_parallel_read_threads設定,或要掃描的索引子樹數,以較小者為準。
以下注意事項適用於 MyISAM 表格
CHECK TABLE會更新MyISAM表格的索引鍵統計資料。如果
CHECK TABLE輸出未傳回OK或Table is already up to date,您通常應該執行表格修復。請參閱第 9.6 節,〈MyISAM 表格維護和當機復原〉。如果未指定任何
CHECK TABLE選項QUICK、MEDIUM或EXTENDED,則動態格式MyISAM表格的預設檢查類型為MEDIUM。這與在表格上執行 myisamchk --medium-checktbl_name的結果相同。靜態格式MyISAM表格的預設檢查類型也為MEDIUM,除非指定CHANGED或FAST。在這種情況下,預設為QUICK。由於列很少損毀,因此會針對CHANGED和FAST跳過列掃描。