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 可發現以下的不相容性
在 MySQL 4.1 和 5.0 之間,
InnoDB和MyISAM資料表的TEXT欄位中末端空白的索引順序已變更。在 MySQL 5.0.3 和 5.0.5 之間,新的
DECIMAL資料類型的儲存方法已變更。有時會對字元集或校對進行變更,而這些變更需要重建資料表索引。如需此類變更的詳細資訊,請參閱 第 3.5 節「MySQL 8.4 中的變更」。如需重建資料表的相關資訊,請參閱 第 3.14 節「重建或修復資料表或索引」。
MySQL 8.4 不支援舊版 MySQL 中允許的 2 位數
YEAR(2)資料類型。對於包含YEAR(2)欄位的資料表,CHECK TABLE建議使用REPAIR TABLE,它會將 2 位數YEAR(2)欄位轉換為 4 位數YEAR欄位。會維護觸發程序的建立時間。
如果資料表包含 5.6.4 之前的格式的舊時間欄位(
TIME、DATETIME和TIMESTAMP欄位,且不支援小數秒精確度),系統會回報該資料表需要重建。這有助於 MySQL 升級程序偵測和升級包含舊時間欄位的資料表。系統會針對使用非原生分割區的資料表發出警告,因為 MySQL 8.4 中已移除非原生分割區。請參閱 第 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 回報的某些問題無法自動更正
發現 auto_increment 欄位值為 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存取無效的 undo log 記錄,進而導致與 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。InnoDBSPATIAL索引的CHECK TABLE功能包括 R-tree 有效性檢查,以及檢查 R-tree 列數是否與叢集索引相符。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,會跳過資料列掃描,因為資料列很少損壞。