top
Loading...
5.9.5.8.如何修復表
5.9.5.8. 如何修復表

本節描述如何對MyISAM表使用myisamchk(擴展名.MYI.MYD)

你還可以(并且應該,如果可能)使用CHECK TABLEREPAIR TABLE語句來檢查和修復MyISAM表。參見13.5.2.3節,“CHECK TABLE語法”和13.5.2.6節,“REPAIR TABLE語法”。

一張損壞的表的癥狀通常是查詢意外中斷并且能看到下述錯誤:

  • tbl_name.frm被鎖定不能更改。
  • 不能找到文件tbl_name.MYIErrcodennn)。
  • 文件意外結束。
  • 記錄文件被毀壞。
  • 從表處理器得到錯誤nnn

要想得到錯誤相關的詳細信息,你可以運行perror nnn,其中nnn為錯誤編號。下面的示例顯示了如何使用perror來找到最常用錯誤編號(用表的方式指出問題)的含義:

shell> perror 126 127 132 134 135 136 141 144 145
126 = Index file is crashed / Wrong file format
127 = Record-file is crashed
132 = Old database file
134 = Record was already deleted (or record file crashed)
135 = No more room in record file
136 = No more room in index file
141 = Duplicate unique key or constraint on write or update
144 = Table is crashed and last repair failed

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 TABLEDESCRIBE來查詢

對于其它的錯誤,你必須修復表。myisamchk通常可以檢測和修復大多數問題。

修復過程包括四個階段,此處將進行描述。開始修復前,應進入數據庫目錄并檢查表文件的許可。在Unix中,確保它們對于運行mysqld用戶可讀(你也應可讀,因為你需要訪問檢查的文件)。如果你需要修改文件,你還必須擁有寫訪問權限。

myisamchk修復表的選項的描述參見5.9.5節,“myisamchk:MyISAM表維護實用工具”的前幾節。

下面幾節列出了上述命令失敗或你想要使用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時,你應將sort_buffer_sizeKey_buffer_size變量的值設置為可用內存的大約25%

首先,試試myisamchk -r -q tbl_name(-r -q意味著“快速恢復模式”)。這將試圖不接觸數據文件來修復索引文件。如果數據文件包含它應有的一切內容和指向數據文件內正確地點的刪除連接,這應該管用并且表可被修復。開始修復下一張表。否則,執行下列過程:

  1. 在繼續前對數據文件進行備份。
  2. 使用myisamchk -r tbl_name(-r意味著“恢復模式”)。這將從數據文件中刪除不正確的記錄和已被刪除的記錄并重建索引文件。
  3. 如果前面的步驟失敗,使用myisamchk --safe-recover tbl_name。安全恢復模式使用一個老的恢復方法,處理常規恢復模式不行的少數情況(但是更慢)

如果在修復時,你得到奇怪的錯誤(例如out of memory錯誤),或如果myisamchk崩潰,到階段3

階段3:困難的修復

只有在索引文件的第一個16K塊被破壞,或包含不正確的信息,或如果索引文件丟失,你才應該到這個階段。在這種情況下,需要創建一個新的索引文件。按如下步驟操做:

  1. 把數據文件移到安全的地方。
  2. 使用表描述文件創建新的()數據文件和索引文件:
  3. shell> mysql db_name
  4. mysql> SET AUTOCOMMIT=1;
  5. mysql> TRUNCATE TABLE tbl_name;
  6. mysql> quit

如果你的MySQL版本沒有TRUNCATE TABLE,則使用DELETE FROM tbl_name

  1. 將老的數據文件拷貝到新創建的數據文件之中。(不要只是將老文件移回新文件之中;你要保留一個副本以防某些東西出錯。)

回到階段2。現在myisamchk -r -q應該工作了。(這不應該是一個無限循環)。

你還可以使用REPAIR TABLE tbl_name USE_FRM,將自動執行整個程序。

階段4:非常困難的修復

只有.frm描述文件也破壞了,你才應該到達這個階段。這應該從未發生過,因為在表被創建以后,描述文件就不再改變了。

  1. 從一個備份恢復描述文件然后回到階段3。你也可以恢復索引文件然后回到階段2。對后者,你應該用myisamchk -r啟動。
  2. 如果你沒有進行備份但是確切地知道表是怎樣創建的,在另一個數據庫中創建表的一個拷貝。刪除新的數據文件,然后從其他數據庫將描述文件和索引文件移到破壞的數據庫中。這樣提供了新的描述和索引文件,但是讓.MYD數據文件獨自留下來了。回到階段2并且嘗試重建索引文件。
作者:mysql.com
來源:http://dev.mysql.com/doc/refman/5.1/zh/database-administration.html
北斗有巢氏 有巢氏北斗