本節的討論說明如何在 MyISAM
表格(副檔名為 .MYI
與 .MYD
)上使用 myisamchk。
您也可以使用 CHECK TABLE
和 REPAIR TABLE
陳述式來檢查及修復 MyISAM
表格。請參閱 第 15.7.3.2 節,〈CHECK TABLE 陳述式〉,以及 第 15.7.3.5 節,〈REPAIR TABLE 陳述式〉。
損毀表格的徵狀包括查詢意外中止,以及下列可觀察到的錯誤
找不到檔案
(錯誤碼:tbl_name
.MYInnn
)意外的檔案結尾
記錄檔案損毀
從表格處理常式取得錯誤
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_ROWS
和 AVG_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 *.MYI 或 myisamchk -e *.MYI,如果您有更多時間。使用 -s
(靜音)選項來隱藏不必要的資訊。
如果 mysqld 伺服器已停止,您應該使用 --update-state
選項來告知 myisamchk 將表格標示為「已檢查。」
您只需要修復 myisamchk 宣告錯誤的那些表格。對於這類表格,請繼續進行階段 2。
如果您在檢查時收到意外的錯誤(例如 out of memory
錯誤),或者如果 myisamchk 當機,請前往階段 3。
階段 2:簡單的安全修復
首先,嘗試使用 myisamchk -r -q tbl_name
(-r -q
代表 “快速修復模式”)。這會嘗試修復索引檔案而不動到資料檔案。如果資料檔案包含所有應有的內容,並且刪除連結指向資料檔案內的正確位置,這應該會奏效,並且表格會被修復。開始修復下一個表格。否則,請使用以下步驟。
在繼續操作之前,請備份資料檔案。
使用 myisamchk -r
tbl_name
(-r
代表 “修復模式”)。這會從資料檔案中移除不正確的列和已刪除的列,並重建索引檔案。如果前一步驟失敗,請使用 myisamchk --safe-recover
tbl_name
。安全修復模式使用較舊的修復方法,可處理一些常規修復模式無法處理的情況(但速度較慢)。
如果您希望修復操作速度更快,您應該在執行 myisamchk 時,將 sort_buffer_size
和 key_buffer_size
變數的值都設定為您可用記憶體的約 25%。
如果在修復時遇到意外錯誤(例如 記憶體不足
錯誤),或 myisamchk 崩潰,請前往階段 3。
階段 3:困難修復
只有當索引檔案中的第一個 16KB 區塊損壞或包含不正確的資訊,或者索引檔案遺失時,您才應該進入此階段。在這種情況下,有必要建立一個新的索引檔案。請按照以下步驟操作:
將資料檔案移動到安全的地方。
使用表格描述檔案建立新的(空的)資料和索引檔案。
$> mysql db_name
mysql> SET autocommit=1; mysql> TRUNCATE TABLE tbl_name; mysql> quit
將舊的資料檔案複製回新建立的資料檔案。(不要只是將舊檔案移回新檔案。您需要保留一份副本,以防發生任何問題。)
如果您正在使用複製功能,您應該在執行上述程序之前停止複製,因為它涉及檔案系統操作,而這些操作不會被 MySQL 記錄。
回到階段 2。myisamchk -r -q 應該會奏效。(這應該不會是無止境的迴圈。)
您也可以使用 REPAIR TABLE
SQL 陳述式,它會自動執行整個程序。此外,由於伺服器在您使用 tbl_name
USE_FRMREPAIR TABLE
時完成所有工作,因此公用程式和伺服器之間也不會發生不必要的交互作用。請參閱 第 15.7.3.5 節,〈REPAIR TABLE 陳述式〉。