文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美式信紙尺寸) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
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 值為 statusMsg_text 通常應為 OKTable is already up to date 表示資料表的儲存引擎指出不需要檢查資料表。

檢查版本相容性

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

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

FOR UPGRADE 會發現這些不相容的情況

  • TEXT 欄位中 InnoDBMyISAM 資料表的尾隨空格索引順序在 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 版之前的舊時間欄位格式 (不支援小數秒精度的 TIMEDATETIMETIMESTAMP 欄位),則會將資料表回報為需要重建。這有助於 MySQL 升級程序偵測和升級包含舊時間欄位的資料表。

  • 針對使用非原生分割的資料表會發出警告,因為 MySQL 9.0 中已移除非原生分割。請參閱第 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 報告的某些問題無法自動修正

  • 發現自動遞增欄位的值為 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 存取無效的復原日誌記錄,進而導致與 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

  • CHECK TABLE 對於 InnoDB SPATIAL 索引的功能包括 R 樹狀結構有效性檢查,以及檢查以確保 R 樹狀結構列計數與叢集索引相符。

  • 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 跳過列掃描。