文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  如何修復 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 (Errcode: 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 時,mysqld 伺服器在 mysqladmin 返回後仍然可用一段時間,直到所有陳述式處理停止且所有索引變更都已刷新到磁碟為止。

階段 1:檢查您的表格

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

如果 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% 左右。

如果在修復時發生非預期的錯誤(例如 out of memory 錯誤),或者 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 Statement」