MySQL資料庫表損壞後的修復方法

chenfeng發表於2016-04-27
1.MyISAM表損壞
用myisamchk命令來修復
myisamchk -r -q 後面跟你的表名.MYI
這個命令是專門修復myism引擎資料庫表的。比如,你的資料庫目錄為
/var/lib/mysql/db
其中一個表為 test
那麼修復test表的方法為
myisamchk -r -q /var/lib/mysql/db/test.MYI
如果修復全部表,用這個命令
myisamchk -r -q /var/lib/mysql/db/*.MYI

2.InnoDB表損壞
InnoDB擁有內部恢復機制,假如資料庫崩潰了,InnoDB透過從最後一個時間戳開始執行日誌檔案,來嘗試修復資料庫。
大多數情況下會修復成功,而且整個過程是透明的。
假如InnoDB自行修復失敗,那麼資料庫將不能啟動。
在繼續操作前,先瀏覽下MySQL的日誌檔案,確定資料庫是因為InnoDB表的損壞而崩潰。
有一種方法是更新InnoDB的日誌檔案計數器以跳過引起崩潰的查詢,這種情況下,將造成資料的不一致性而且會經常使主從複製中斷。
一旦確定MySQL因為InnoDB表損壞無法啟動時,就可以按照以下5步進行修復:
1.編輯/etc/my.cnf檔案,加入如下行:
innodb_force_recovery = 4
2.這時就可以重新啟動資料庫了,在innodb_force_recovery配置的作用,所有的插入與更新操作將被忽略;
3.匯出所有的資料表;
4.關閉資料庫並刪除所有資料表檔案及目錄,再執行 mysql_install_db來建立MySQL預設資料表;
5.在/etc/my.cnf中刪除innodb_force_recovery這一行,再啟動MySQL(這時MySQL正常啟動);
6.從第3步備份的檔案中恢復所有的資料。

innodb_force_recovery可以設定為1-6,大的數字包含前面所有數字的影響。當設定引數值大於0後,可以對錶進行select,create,drop操作,但insert,update或者delete這類操作是不允許的。 
1(SRV_FORCE_IGNORE_CORRUPT):忽略檢查到的corrupt頁。
2(SRV_FORCE_NO_BACKGROUND):阻止主執行緒的執行,如主執行緒需要執行full purge操作,會導致crash。
3(SRV_FORCE_NO_TRX_UNDO):不執行事務回滾操作。
4(SRV_FORCE_NO_IBUF_MERGE):不執行插入緩衝的合併操作。
5(SRV_FORCE_NO_UNDO_LOG_SCAN):不檢視重做日誌,InnoDB儲存引擎會將未提交的事務視為已提交。
6(SRV_FORCE_NO_LOG_REDO):不執行前滾的操作。





來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15498/viewspace-2089363/,如需轉載,請註明出處,否則將追究法律責任。

相關文章