當MySQL服務異常重啟失敗后,可以通過配置參數innodb_force_recovery來對MySQL服務進行修復啟動。
參數innodb_force_recovery選項:
1 (SRV_FORCE_IGNORE_CORRUPT): 忽略檢查到的 corrupt 頁。盡管檢測到了損壞的 page 仍強制服務運行。一般設置為該值即可,然后 dump 出庫表進行重建。 2 (SRV_FORCE_NO_BACKGROUND): 阻止主線程的運行,如主線程需要執行 full purge 操作,會導致 crash。 阻止 master thread 和任何 purge thread 運行。若 crash 發生在 purge 環節則使用該值。 3 (SRV_FORCE_NO_TRX_UNDO): 不執行事務回滾操作。 4 (SRV_FORCE_NO_IBUF_MERGE): 不執行插入緩沖的合並操作。如果可能導致崩潰則不要做這些操作。不要進行統計操作。該值可能永久損壞數據文件。若使用了該值,則將來要刪除和重建輔助索引。 5 (SRV_FORCE_NO_UNDO_LOG_SCAN): 不查看重做日志,InnoDB 存儲引擎會將未提交的事務視為已提交。此時 InnoDB 甚至把未完成的事務按照提交處理。該值可能永久性的損壞數據文件。 6 (SRV_FORCE_NO_LOG_REDO): 不執行前滾的操作。恢復時不做 redo log roll-forward。使數據庫頁處於廢止狀態,繼而可能引起 B 樹或者其他數據庫結構更多的損壞。
參數innodb_force_recovery設置:
在配置文件中的mysqld模塊添加參數innodb_force_recovery。
[mysqld] innodb_force_recovery = N
相同參數innodb_force_recovery在不同MySQL版本允許的操作可能不同,所有版本中innodb_force_recovery>0時都允許對表進行SELECT操作。
使用參數innodb_force_recovery建議:
1、如果MySQL服務故障重啟后,因為事務回滾導致異常,可以將參數innodb_force_recovery設置為3跳過回滾階段 2、如果因為MySQL數據頁損壞導致異常,可以使用SELECT+WHERE查找出未損壞數據並將其通過mysqldump導出。 3、將innodb_force_recovery參數設置大於0啟動服務后,應通過修改端口或域名(VIP)指向來屏蔽應用訪問。 4、將innodb_force_recovery參數設置大於0啟動服務后,可以通過mysqlcheck命令來對表進行檢查/分析/優化/修復。 5、使用force_recovery重啟服務前,建議對數據庫所有文件進行備份,避免修復過程中對數據進行二次損害。
在日常運維中,應將使用innodb_force_recovery參數進行數據恢復作為最后手段,做好完善的備份恢復機制,避免對數據庫做高危操作。