文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 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 參考手冊  /  ...  /  如何修復 MyISAM 表格

9.6.3 如何修復 MyISAM 表格

本節的討論說明如何在 MyISAM 表格(副檔名為 .MYI.MYD)上使用 myisamchk

您也可以使用 CHECK TABLEREPAIR TABLE 陳述式來檢查及修復 MyISAM 表格。請參閱 第 15.7.3.2 節,〈CHECK TABLE 陳述式〉,以及 第 15.7.3.5 節,〈REPAIR TABLE 陳述式〉

損毀表格的徵狀包括查詢意外中止,以及下列可觀察到的錯誤

  • 找不到檔案 tbl_name.MYI (錯誤碼: nnn)

  • 意外的檔案結尾

  • 記錄檔案損毀

  • 從表格處理常式取得錯誤 nnn

若要取得更多關於錯誤的資訊,請執行 perror nnn,其中 nnn 是錯誤編號。以下範例顯示如何使用 perror 來尋找最常見的錯誤編號的含義,這些錯誤編號表示表格出現問題

$> perror 126 127 132 134 135 136 141 144 145
MySQL error code 126 = Index file is crashed
MySQL error code 127 = Record-file is crashed
MySQL error code 132 = Old database file
MySQL error code 134 = Record was already deleted (or record file crashed)
MySQL error code 135 = No more room in record file
MySQL error code 136 = No more room in index file
MySQL error code 141 = Duplicate unique key or constraint on write or update
MySQL error code 144 = Table is crashed and last repair failed
MySQL error code 145 = Table was marked as crashed and should be repaired

請注意,錯誤 135 (記錄檔案中沒有更多空間) 和錯誤 136 (索引檔案中沒有更多空間) 並非可透過簡單修復解決的錯誤。在此情況下,您必須使用 ALTER TABLE 來增加 MAX_ROWSAVG_ROW_LENGTH 表格選項值

ALTER TABLE tbl_name MAX_ROWS=xxx AVG_ROW_LENGTH=yyy;

如果您不知道目前的表格選項值,請使用 SHOW CREATE TABLE

對於其他錯誤,您必須修復表格。myisamchk 通常可以偵測並修正發生的大部分問題。

修復程序包含最多三個階段,如下所述。在您開始之前,您應該將位置變更為資料庫目錄,並檢查表格檔案的權限。在 Unix 上,請確保執行 mysqld 的使用者可以讀取這些檔案(而且您也可以讀取,因為您需要存取您正在檢查的檔案)。如果結果顯示您需要修改檔案,您也必須具有寫入權限。

本節適用於表格檢查失敗的情況(例如 第 9.6.2 節,〈如何檢查 MyISAM 表格是否有錯誤〉中所述的那些情況),或者您想要使用 myisamchk 提供的延伸功能。

myisamchk 用於表格維護的選項說明於 第 6.6.4 節,〈myisamchk — MyISAM 表格維護公用程式〉myisamchk 也有變數可供您設定來控制記憶體配置,這可以改善效能。請參閱 第 6.6.4.6 節,〈myisamchk 記憶體使用量〉

如果您要從命令列修復表格,您必須先停止 mysqld 伺服器。請注意,當您在遠端伺服器上執行 mysqladmin shutdown 時,在 mysqladmin 傳回後,mysqld 伺服器仍然可使用一段時間,直到所有陳述式處理都已停止,且所有索引變更都已刷新至磁碟。

階段 1:檢查您的表格

執行 myisamchk *.MYImyisamchk -e *.MYI,如果您有更多時間。使用 -s(靜音)選項來隱藏不必要的資訊。

如果 mysqld 伺服器已停止,您應該使用 --update-state 選項來告知 myisamchk 將表格標示為「已檢查。

您只需要修復 myisamchk 宣告錯誤的那些表格。對於這類表格,請繼續進行階段 2。

如果您在檢查時收到意外的錯誤(例如 out of memory 錯誤),或者如果 myisamchk 當機,請前往階段 3。

階段 2:簡單的安全修復

首先,嘗試使用 myisamchk -r -q tbl_name (-r -q 代表 快速修復模式)。這會嘗試修復索引檔案而不動到資料檔案。如果資料檔案包含所有應有的內容,並且刪除連結指向資料檔案內的正確位置,這應該會奏效,並且表格會被修復。開始修復下一個表格。否則,請使用以下步驟。

  1. 在繼續操作之前,請備份資料檔案。

  2. 使用 myisamchk -r tbl_name (-r 代表 修復模式)。這會從資料檔案中移除不正確的列和已刪除的列,並重建索引檔案。

  3. 如果前一步驟失敗,請使用 myisamchk --safe-recover tbl_name。安全修復模式使用較舊的修復方法,可處理一些常規修復模式無法處理的情況(但速度較慢)。

注意

如果您希望修復操作速度更快,您應該在執行 myisamchk 時,將 sort_buffer_sizekey_buffer_size 變數的值都設定為您可用記憶體的約 25%。

如果在修復時遇到意外錯誤(例如 記憶體不足 錯誤),或 myisamchk 崩潰,請前往階段 3。

階段 3:困難修復

只有當索引檔案中的第一個 16KB 區塊損壞或包含不正確的資訊,或者索引檔案遺失時,您才應該進入此階段。在這種情況下,有必要建立一個新的索引檔案。請按照以下步驟操作:

  1. 將資料檔案移動到安全的地方。

  2. 使用表格描述檔案建立新的(空的)資料和索引檔案。

    $> mysql db_name
    mysql> SET autocommit=1;
    mysql> TRUNCATE TABLE tbl_name;
    mysql> quit
  3. 將舊的資料檔案複製回新建立的資料檔案。(不要只是將舊檔案移回新檔案。您需要保留一份副本,以防發生任何問題。)

重要

如果您正在使用複製功能,您應該在執行上述程序之前停止複製,因為它涉及檔案系統操作,而這些操作不會被 MySQL 記錄。

回到階段 2。myisamchk -r -q 應該會奏效。(這應該不會是無止境的迴圈。)

您也可以使用 REPAIR TABLE tbl_name USE_FRM SQL 陳述式,它會自動執行整個程序。此外,由於伺服器在您使用 REPAIR TABLE 時完成所有工作,因此公用程式和伺服器之間也不會發生不必要的交互作用。請參閱 第 15.7.3.5 節,〈REPAIR TABLE 陳述式〉