mysql innodb 引擎損壞恢復的參考資料還是很多的,以下記錄一個問題的處理
問題
異常停電,mysql 重啟異常,innodb tablespace 異常
一般常見的解決方法
備份,刪除ibdata1,ib_logfile* 等文件,配置
innodb_force_recovery = 6
innodb_purge_threads = 1
然后嘗試重啟
簡單說明
以上方法不直接推薦使用,理論上先備份是最好的,也是應該做的,然后逐步嘗試從1-6進行增加處理
當然不同的步驟進行的操作是不一樣的,如果1可以進入(先備份),同時可以鏈接數據庫特別好,鏈接
進行數據備份(很重要),然后嘗試不同的級別,查看mysql server log,查看信息,一般會有提示信息的
告訴我們那種表的有異常(也可以使用mysqlcheck工具)
碰到的幾個問題
可能系統比較好,異常停電的時候,1 可以進入然后就進行了備份操作(dump),然后就打算使用6模式
進行數據處理了(首先進行了db 數據備份),然后刪除ibdata1,ib_logfile* 結果提示table 不存在,感覺
不對,然后基於已有的備份,直接替換刪除的文件,還是使用6模式,特別好,直接可以訪問數據庫,同時
給了一個比較好的err 提示(mysql server 日志)index 異常(就一張表,特別好),因為上邊已經備份了
數據庫,為了方便又進行了異常索引表數據的備份,因為模式是6不能進行刪除操作,所以在系統db 創建了
又異常的表,停止mysql 然后copy 了frm文件到有問題的db 系統,然后修改模式為1,此模式下我們可以進行
數據表的操作,然后我們刪除了有異常的table,重新導入數據進行恢復,之后停止mysql,修改innodb_force_recovery
為默認的,啟動mysql 測試發現系統已經正常了,實際上我們全程可以基於1模式進行數據庫的恢復
總結
進行恢復的時候盡備份很重要,遇到問題不能着急,應該思考下(尤其比較重要的db系統),同時對於依賴db的系統
也應該進行可能的停機(避免數據不一致的操作),官方文檔是特別好的資料,不能直接百度搜索解決問題
參考資料
https://dev.mysql.com/doc/refman/8.0/en/forcing-innodb-recovery.html
https://www.askmaclean.com/archives/innodb-corruption-recover-guide.html