文件首頁
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


MySQL 8.4 參考手冊  /  ...  /  REPAIR TABLE 陳述式

15.7.3.5 REPAIR TABLE 陳述式

REPAIR [NO_WRITE_TO_BINLOG | LOCAL]
    TABLE tbl_name [, tbl_name] ...
    [QUICK] [EXTENDED] [USE_FRM]

REPAIR TABLE 僅針對某些儲存引擎,修復可能已損毀的表格。

此陳述式需要對該表格擁有 SELECTINSERT 權限。

雖然正常情況下您永遠不需要執行 REPAIR TABLE,但如果發生災難,此陳述式很有可能從 MyISAM 表格中取回所有資料。如果您的表格經常損毀,請嘗試找出原因,以消除使用 REPAIR TABLE 的需求。請參閱第 B.3.3.3 節,「如果 MySQL 持續崩潰該怎麼辦」第 18.2.4 節,「MyISAM 表格問題」

REPAIR TABLE 會檢查表格是否需要升級。如果需要,它會執行升級,遵循與 CHECK TABLE ... FOR UPGRADE 相同的規則。如需詳細資訊,請參閱第 15.7.3.2 節,「CHECK TABLE 陳述式」

重要
  • 在執行表格修復操作之前,請先備份表格;在某些情況下,此操作可能會導致資料遺失。可能的原因包括但不限於檔案系統錯誤。請參閱第 9 章,《備份與復原》

  • 如果伺服器在 REPAIR TABLE 操作期間退出,則在重新啟動後,務必立即對該表格執行另一個 REPAIR TABLE 陳述式,然後才能對其執行任何其他操作。在最糟糕的情況下,您可能會得到一個沒有資料檔案資訊的新空白索引檔案,然後您執行的下一個操作可能會覆蓋該資料檔案。這是一個不太可能但可能發生的情況,強調了先進行備份的價值。

  • 如果來源上的表格損毀,而您對其執行 REPAIR TABLE,則對原始表格所做的任何變更都不會傳播到副本。

REPAIR TABLE 儲存引擎與分割區支援

REPAIR TABLE 適用於 MyISAMARCHIVECSV 表格。對於 MyISAM 表格,預設情況下,其效果與 myisamchk --recover tbl_name 相同。此陳述式不適用於視圖。

REPAIR TABLE 支援分割區表格。但是,USE_FRM 選項不能用於分割區表格的此陳述式。

您可以使用 ALTER TABLE ... REPAIR PARTITION 來修復一個或多個分割區;如需更多資訊,請參閱第 15.1.9 節,「ALTER TABLE 陳述式」第 26.3.4 節,「分割區維護」

REPAIR TABLE 選項
  • NO_WRITE_TO_BINLOGLOCAL

    預設情況下,伺服器會將 REPAIR TABLE 陳述式寫入二進位記錄檔,以便將其複製到副本。若要抑制記錄,請指定選用的 NO_WRITE_TO_BINLOG 關鍵字或其別名 LOCAL

  • QUICK

    如果您使用 QUICK 選項,REPAIR TABLE 會嘗試僅修復索引檔案,而不修復資料檔案。這種修復類型與 myisamchk --recover --quick 所做的修復類似。

  • EXTENDED

    如果您使用 EXTENDED 選項,MySQL 會逐列建立索引,而不是透過排序一次建立一個索引。這種修復類型與 myisamchk --safe-recover 所做的修復類似。

  • USE_FRM

    如果 .MYI 索引檔案遺失或其標頭損毀,則可以使用 USE_FRM 選項。此選項會告知 MySQL 不要信任 .MYI 檔案標頭中的資訊,並使用資料字典中的資訊重新建立它。這種修復無法使用 myisamchk 完成。

    注意

    僅當您無法使用一般 REPAIR 模式時,才使用 USE_FRM 選項。告知伺服器忽略 .MYI 檔案會使儲存在 .MYI 中的重要表格中繼資料無法用於修復程序,這可能會產生有害的後果。

    • 遺失目前的 AUTO_INCREMENT 值。

    • 遺失表格中已刪除記錄的連結,這表示已刪除記錄的可用空間之後會保持閒置狀態。

    • .MYI 標頭會指出表格是否已壓縮。如果伺服器忽略此資訊,則無法判斷表格已壓縮,並且修復可能會導致表格內容變更或遺失。這表示 USE_FRM 不應與壓縮表格一起使用。無論如何,這應該是不必要的:壓縮表格是唯讀的,因此不應該損毀。

    如果對由不同版本 MySQL 伺服器建立的表格使用 USE_FRM,則 REPAIR TABLE 不會嘗試修復表格。在此情況下,REPAIR TABLE 傳回的結果集中包含一行,其中 Msg_type 值為 errorMsg_text 值為 Failed repairing incompatible .FRM file

    如果使用 USE_FRMREPAIR TABLE 不會檢查表格以判斷是否需要升級。

REPAIR TABLE 輸出

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

欄位
表格 表格名稱
Op 一律為 repair
Msg_type statuserrorinfonotewarning
Msg_text 資訊訊息

對於每個修復的表格,REPAIR TABLE 陳述式可能會產生多行資訊。最後一行的 Msg_type 值為 status,而 Msg_test 通常應為 OK。對於 MyISAM 表格,如果您沒有取得 OK,則應該嘗試使用 myisamchk --safe-recover 修復它。(REPAIR TABLE 並未實作 myisamchk 的所有選項。使用 myisamchk --safe-recover,您也可以使用 REPAIR TABLE 不支援的選項,例如 --max-record-length。)

REPAIR TABLE 表格會捕獲並擲回從舊的損毀檔案複製表格統計資料到新建立的檔案時發生的任何錯誤。例如,如果 .MYD.MYI 檔案擁有者的使用者 ID 與 mysqld 程序的使用者 ID 不同,則除非 mysqld 是由 root 使用者啟動的,否則 REPAIR TABLE 會產生「無法變更檔案擁有權」錯誤。

表格修復考量

您可以透過設定某些系統變數來提高 REPAIR TABLE 的效能。請參閱第 10.6.3 節,「最佳化 REPAIR TABLE 陳述式」

如果表格包含 5.6.4 版本之前的舊時間欄位,REPAIR TABLE 會升級表格;也就是說,TIMEDATETIMETIMESTAMP 欄位缺少對小數秒精度的支援。