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
。InnoDB
SPATIAL
索引的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
,會跳過資料列掃描,因為資料列很少損壞。