本節中的討論描述如何針對 MyISAM
表(擴展名為 .MYI
和 .MYD
)使用 myisamchk。
您也可以使用 CHECK TABLE
和 REPAIR TABLE
陳述式來檢查和修復 MyISAM
表。請參閱 第 15.7.3.2 節,「CHECK TABLE 陳述式」和 第 15.7.3.5 節,「REPAIR TABLE 陳述式」。
損毀的表格的徵狀包括查詢意外中止,以及以下可觀察到的錯誤
找不到檔案
(Errcode: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 時,mysqld 伺服器在 mysqladmin 返回後仍然可用一段時間,直到所有陳述式處理停止且所有索引變更都已刷新到磁碟為止。
階段 1:檢查您的表格
執行 myisamchk *.MYI 或 myisamchk -e *.MYI,如果您有更多時間。使用 -s
(silent) 選項來抑制不必要的資訊。
如果 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% 左右。
如果在修復時發生非預期的錯誤(例如 out of memory
錯誤),或者 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 Statement」。