REPAIR [NO_WRITE_TO_BINLOG | LOCAL]
TABLE tbl_name [, tbl_name] ...
[QUICK] [EXTENDED] [USE_FRM]
REPAIR TABLE
僅針對某些儲存引擎,修復可能已損毀的表格。
此陳述式需要對該表格擁有 SELECT
和 INSERT
權限。
雖然正常情況下您永遠不需要執行 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
適用於 MyISAM
、ARCHIVE
和 CSV
表格。對於 MyISAM
表格,預設情況下,其效果與 myisamchk --recover tbl_name
相同。此陳述式不適用於視圖。
REPAIR TABLE
支援分割區表格。但是,USE_FRM
選項不能用於分割區表格的此陳述式。
您可以使用 ALTER TABLE ... REPAIR PARTITION
來修復一個或多個分割區;如需更多資訊,請參閱第 15.1.9 節,「ALTER TABLE 陳述式」和第 26.3.4 節,「分割區維護」。
NO_WRITE_TO_BINLOG
或LOCAL
預設情況下,伺服器會將
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
值為error
,Msg_text
值為Failed repairing incompatible .FRM file
。如果使用
USE_FRM
,REPAIR TABLE
不會檢查表格以判斷是否需要升級。
REPAIR TABLE
會傳回一個結果集,其中包含下表中顯示的欄位。
欄位 | 值 |
---|---|
表格 |
表格名稱 |
Op |
一律為 repair |
Msg_type |
status 、error 、info 、note 或 warning |
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
會升級表格;也就是說,TIME
、DATETIME
和 TIMESTAMP
欄位缺少對小數秒精度的支援。