公司采用的是windows server 2008+mysql,由於種種原因,mysql沒有定期備份,也為此次故障埋下了隱患。
8月某天,突然停電,悲劇的機房UPS有故障沒有工作,所有服務器直接斷電,頓時有種不祥的預感。來電后幸好所有服務器都正常啟動了,不過還是悲劇了,mysql無法啟動,服務一啟動就報錯:mysql 1067 進程意外終止。
查看了系統日志,windows日志並沒有給出有用的信息,只是顯示
錯誤應用程序名稱: mysqld-nt.exe,版本: 0.0.0.0,時間戳: 0x4ad764a7
錯誤模塊名稱: mysqld-nt.exe,版本: 0.0.0.0,時間戳: 0x4ad764a7
通過網上資料查詢,多半是innodb引擎日志問題所致,具體處理步驟如下:
一、在mysql安裝路徑下修改my.ini配置文件,在尾部添加innodb_force_recovery = 6,此選項可以讓mysql啟動時跳過修復。對於次選項的詳細解釋如下:
innodb_force_recovery可以設置為1-6,大的數字包含前面所有數字的影響。
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):不執行前滾的操作。
注意
a 當設置參數值大於0后,可以對表進行select,create,drop操作,但insert,update或者delete這類操作是不允許的。
b 當innodb_purge_threads 和 innodb_force_recovery一起設置會出現一種loop現象,故不建議同時使用,也會是mysql無法啟動。
二、再次啟動mysql服務,應該就可以正常啟動,使用mysqldump備份數據庫:
>mysqldump -uUSERNAME -pPASSWORD DB_NAME > E:/DBBACK.SQL
如果備份時候有表數據損壞,會有兩種提示:
1、Incorrect file format ,表格式不正確,只能采用repair語句恢復表結構:
repair table TB_NAME use_frm;(貌似這種只支持myisam存儲引擎)
2、Counldn't execute 'show create table `userarenalog`':Table ...is marked as crashed and should be repaired(145),同樣可以采用repair修復損壞的表:
repair table TB_NAME
三、卸載並刪除原有mysql數據,重新安裝。
四、重新創建數據庫並恢復數據:
mysql>create database DB_NAME;//創建數據庫
mysql>use DB_NAME;//選中數據庫
mysql>source e:/DBBACK.SQL//恢復數據庫
其實修復過程中間還有諸多彎路,最終這個才是最簡單迅速的,希望能給各位借鑒。