一張損壞的表的症狀通常是查詢意外中斷並且你能看到例如這些錯誤:
“tbl_name.frm”被鎖定不能改變。
不能找到文件“tbl_name.MYI”(Errcode :### )。
從表處理器的得到錯誤###(此時,錯誤135是一個例外)。
意外的文件結束。
記錄文件被毀壞。
在這些情況下,你必須修復表。表的修復是一項非常困難的工作,很多情況下令人束手無策。然而,有一些常規的知道思想和過程,可以遵循它們來增加修正表的機會。通常,開始是可以用最快的修復方法,看看能否袖珍故障。如果發現不成功,可以逐步升級到更徹底的但更慢的修復方法。如果仍舊難以修復,就應該從備份中恢復了。在上一章已經詳細介紹了這一部分內容。
簡單安全的修復
為了修復一個表執行下列步驟:
首先,用--recover,-r選項修正表,並且用--quick,-q選項,來只根據索引文件的內容進行恢復。這樣不接觸數據文件來修復索引文件。(-r意味著“恢復模式”)
myisamchk -r -q tbl_nameisamchk -r -q tbl_name
如果問題仍舊存在,則忽略--quick選項,允許修復程序修改數據文件,因為這可能存在問題。下面的命令將從數據文件中刪除不正確的記錄和已被刪除的記錄並重建索引文件:
myisamchk -r tbl_nameisamchk -r tbl_name
如果前面的步驟失敗,使用。安全恢復模式使用一個老的恢復方法,處理常規恢復模式不行的少數情況(但是更慢)。
myisamchk --safe-recover tbl_nameisamchk --safe-recover tbl_name
困難的修理
如果在索引文件的第一個16K塊被破壞,或包含不正確的信息,或如果索引文件丟失,你只應該到這個階段 。在這種情況下,創建一個新的索引文件是必要的。按如下這樣的步驟做:
定位到包含崩潰表的數據庫目錄中
把數據文件移更安全的地方。
使用表描述文件創建新的(空)數據和索引文件:
shell> mysql db_namemysql> DELETE FROM tbl_name;mysql> quit
上述語句將重新創建新的空表,並使用表的的描述文件tbl_name.frm重新生成新的數據和索引文件。
將老的數據文件拷貝到新創建的數據文件之中。(不要只是將老文件移回新文件之中;你要保留一個副本以防某些東西出錯。)
在使用標准的修復方法。現在myisamchk -r -q應該工作了。(這不應該是一個無限循環)。
如果你擁有表的備份文件,那麼一切過程就容易的多。從備份文件中可以恢復表的描述文件,然後在檢查表,有可能還要繼續使用標准的修復方法,應該糾可以解決問題了。
非常困難的修復
只有描述文件也破壞了,你才應該到達這個階段。這應該從未發生過,因為在表被創建以後,描述文件就不再改變了。
從一個備份恢復描述文件並且回到階段2。你也可以恢復索引文件並且回到階段1。對於後者,你應該用myisamchk -r啟動。
如果因為某種原因,數據的備份文件丟失或者沒有備份文件,但是你還記得建立表的CREATE TABLE語句,那麼太好了,這樣還是可以恢復索引文件:
定位到包含崩潰表的數據庫目錄中
把數據文件移更安全的地方。再把數據庫目錄中的對應的目錄刪去.。
調用mysql並發復CREATE TABLE語句建立該表。(.)
退出mysql,將原始的數據文件和索引文件移回到數據庫的目錄中,替換剛才新建的文件。
然後回到階段2,修復表。也可以只移回數據文件,這樣保留新的描述和索引文件,然後回到階段1,繼續用標准的方法修復表。