文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


15.7.3.2 CHECK TABLE 陳述式

CHECK TABLE tbl_name [, tbl_name] ... [option] ...

option: {
    FOR UPGRADE
  | QUICK
  | FAST
  | MEDIUM
  | EXTENDED
  | CHANGED
}

CHECK TABLE 檢查一個或多個資料表是否有錯誤。CHECK TABLE 也可以檢查視圖是否存在問題,例如視圖定義中引用的資料表已不存在。

要檢查資料表,您必須擁有該資料表的某些權限。

CHECK TABLE 適用於 InnoDBMyISAMARCHIVECSV 資料表。

InnoDB 資料表上執行 CHECK TABLE 之前,請參閱 InnoDB 資料表的 CHECK TABLE 使用注意事項

CHECK TABLE 支援分割資料表,您可以使用 ALTER TABLE ... CHECK PARTITION 來檢查一個或多個分割區;如需更多資訊,請參閱 第 15.1.9 節「ALTER TABLE 陳述式」第 26.3.4 節「分割區的維護」

CHECK TABLE 會忽略未建立索引的虛擬產生欄。

CHECK TABLE 輸出

CHECK TABLE 會傳回一個結果集,其中包含下表所示的欄位。

欄位
資料表 資料表名稱
Op 永遠為 check
Msg_type statuserrorinfonotewarning
Msg_text 資訊訊息

此陳述式可能會為每個檢查的資料表產生多個資訊列。最後一列的 Msg_type 值為 status,而 Msg_text 通常應為 OKTable is already up to date 表示該資料表的儲存引擎表示無需檢查該資料表。

檢查版本相容性

FOR UPGRADE 選項會檢查指定的資料表是否與目前版本的 MySQL 相容。使用 FOR UPGRADE 時,伺服器會檢查每個資料表,以判斷自建立資料表以來,資料表的任何資料類型或索引是否發生任何不相容的變更。如果沒有,則檢查成功。否則,如果有任何可能的不相容,伺服器會對資料表執行完整檢查(這可能需要一些時間)。

不相容性可能發生,原因在於資料類型的儲存格式已變更,或其排序順序已變更。我們的目標是避免這些變更,但有時為了更正比版本之間不相容性更嚴重的問題,這些變更是有其必要的。

FOR UPGRADE 可發現以下的不相容性

  • 在 MySQL 4.1 和 5.0 之間,InnoDBMyISAM 資料表的 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 之前的格式的舊時間欄位(TIMEDATETIMETIMESTAMP 欄位,且不支援小數秒精確度),系統會回報該資料表需要重建。這有助於 MySQL 升級程序偵測和升級包含舊時間欄位的資料表。

  • 系統會針對使用非原生分割區的資料表發出警告,因為 MySQL 8.4 中已移除非原生分割區。請參閱 第 26 章分割區

檢查資料一致性

下表顯示可給予的其他檢查選項。這些選項會傳遞至儲存引擎,而儲存引擎可能會使用或忽略這些選項。

類型 意義
QUICK 不掃描資料列以檢查不正確的連結。適用於 InnoDBMyISAM 資料表和視圖。
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 應該會發現資料檔案中的任何錯誤。如果發生這種情況,資料表會標記為「已損毀」,並且在修復之前無法使用。)

FASTCHANGED 主要用於從指令碼(例如,從 cron 執行)定期檢查資料表。在大多數情況下,FASTCHANGED 更受歡迎。(唯一不喜歡的情況是,當您懷疑在 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 使用注意事項

下列注意事項適用於 InnoDB 資料表

  • 如果 CHECK TABLE 遇到損毀的頁面,伺服器會結束以防止錯誤傳播(錯誤 #10132)。如果損毀發生在次要索引中,但資料表資料可讀,則執行 CHECK TABLE 仍可能導致伺服器結束。

  • 如果 CHECK TABLE 在叢集索引中遇到損壞的 DB_TRX_IDDB_ROLL_PTR 欄位,CHECK TABLE 可能會導致 InnoDB 存取無效的 undo log 記錄,進而導致與 MVCC 相關的伺服器退出。

  • 如果 CHECK TABLEInnoDB 資料表或索引中遇到錯誤,它會報告錯誤,並且通常會將索引標記為損壞,有時也會將資料表標記為損壞,從而阻止進一步使用該索引或資料表。此類錯誤包括次要索引中的條目數量不正確或連結不正確。

  • 如果 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 的效能。InnoDBCHECK TABLE 操作期間會讀取叢集索引兩次。第二次讀取可以平行執行。必須將 innodb_parallel_read_threads 會話變數設定為大於 1 的值,才會發生平行叢集索引讀取。用於執行平行叢集索引讀取的實際執行緒數,取決於 innodb_parallel_read_threads 設定或要掃描的索引子樹數量,取兩者中較小的值。

MyISAM 資料表的 CHECK TABLE 使用注意事項

以下注意事項適用於 MyISAM 資料表

  • CHECK TABLE 會更新 MyISAM 資料表的鍵值統計資訊。

  • 如果 CHECK TABLE 輸出未傳回 OKTable is already up to date,您通常應該執行資料表修復。請參閱第 9.6 節,「MyISAM 資料表維護與當機復原」

  • 如果未指定任何 CHECK TABLE 選項 QUICKMEDIUMEXTENDED,動態格式 MyISAM 資料表的預設檢查類型為 MEDIUM。這與在資料表上執行 myisamchk --medium-check tbl_name 的結果相同。對於靜態格式 MyISAM 資料表,預設檢查類型也是 MEDIUM,除非指定 CHANGEDFAST。在這種情況下,預設值為 QUICK。對於 CHANGEDFAST,會跳過資料列掃描,因為資料列很少損壞。