這篇文章主要介紹了mysql innodb 異常修復經驗分享,需要的朋友可以參考下
一套測試用的mysql庫,之前用的centos6預設源裡的mysql 5.1.71的版本。後來想試試下Percona server 5.7,由於這套庫裡沒有什麼重要資料 。所以操作前也未進行備份,配置好來源後,直接就進行了安裝。資料檔案也存放在預設位置,安裝完成後,直接啟動mysql,發現啟動失敗,發現無法啟動正常啟動。
一、回退重新裝mysql
為避免再從其他地方匯入這個資料的麻煩,先對目前庫的資料庫檔案做了備份(/ var/lib/mysql/位置)。接下來將Percona server 5.7套件進行了卸載,重新安裝原先舊的5.1.71的套件,啟動mysql服務,提示Unknown/unsupported table type: innodb,無法正常啟動。
110509 12:04:27 InnoDB: Initializing buffer pool, size = 384.0M 110509 12:04:27 InnoDB: Completed initialization of buffer pool InnoDB: Error: log file ./ib_logfile0 is of different size 0 5242880 bytes InnoDB: than specified in the .cnf file 0 157286400 bytes! 110509 12:04:27 [ERROR] Plugin 'InnoDB' init function returned error. 110509 12:04:27 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed. 110509 12:04:27 [ERROR] Unknown/unsupported table type: innodb 110509 12:04:27 [ERROR] Aborting 110509 12:04:27 [Note] /usr/sbin/mysqld: Shutdown complete
刪除/var/lib/mysql/目錄,重新啟動資料庫服務,並初始化,發現正常,show engines能發現有innodb引擎。再將資料庫停掉,將先前備份的/var/lib/mysql/目錄的內容覆蓋目前位置的內容,重新啟動。又發現不能進行啟動,報錯內容和剛剛一樣。
/var/lib/mysql目錄內容的結構如下:
-rw-rw---- 1 mysql mysql 10485760 2月 26 18:10 ibdata1 -rw-rw---- 1 mysql mysql 5242880 2月 26 18:10 ib_logfile0 -rw-rw---- 1 mysql mysql 5242880 2月 26 17:20 ib_logfile1 drwx------ 2 mysql mysql 4096 2月 26 17:20 mysql drwx------ 2 mysql mysql 4096 2月 26 17:24 wiki
wiki目錄是測試資料的函式庫,ibdata1文件為資料文件,ib開頭的兩個文件為日誌文件,mysql目錄下為系統函式庫相關的東西。再次使用初始化的數據,並將wiki目錄和ibdata1檔案覆蓋到/var/lib/mysql 目錄下,可以正常啟動,也可以正常登入。
二、innodb模組重裝
不過在透過mysqldump備份時,又提示unknow table engine "Innodb" 。登入後,查看目前所有的引擎類型,發現其中果然不存在innodb類型:
#透過alter指令修改其中一個表的類型為MyISAM ,發現仍然報錯。
透過 find 找出發現/usr/lib64/mysql/plugin/目錄下有ha_innodb_plugin.so檔。印像中mysql5以後的版本支援線上外掛安裝 。透過下面查看確認,果然支援:
使用以下指令載入時,發現不成功:
install plugin innodb soname 'ha_innodb.so';
三、備份
在/etc/my.cnf中增加如下配置:
plugin-load=innodb=ha_innodb_plugin.so plugin_dir=/usr/lib64/mysql/plugin/ default-storage-engine=InnoDB
發現仍啟動失敗。查看mysql-error.log發現有以下內容:
InnoDB: Database page corruption on disk or a failed InnoDB: file read of page 7. InnoDB: You may have to recover from a backup. InnoDB: It is also possible that your operating InnoDB: system has corrupted its own file cache InnoDB: and rebooting your computer removes the InnoDB: error. InnoDB: If the corrupt page is an index page InnoDB: you can also try to fix the corruption InnoDB: by dumping, dropping, and reimporting InnoDB: the corrupt table. You can use CHECK InnoDB: TABLE to scan your table for corruption. InnoDB: See also http://dev.mysql.com/doc/refman/5.1/en/forcing-innodb-recovery.html
開啟forcing-innodb-recovery官方頁面,發現可以透過指定innodb_force_recovery參數,進行強制啟動和復原。在/etc/my.cnf中增加以下內容:
innodb_force_recovery=6
重新啟動成功了。透過mysqldump備份也沒有問題,將備份資料匯入其他主機發現也正常可以測試。
這下就好搞了,將mysql徹底刪除,重新安裝Percona server 5.7,安裝完後,建庫,還原數據,程式重新連接,一切OK。
總結:
由於mysql innodb資料檔的特性,可以在出現問題,無法正常啟動時,先將./ib_logfile0 和./ib_logfile1 兩個日誌檔案先移走,再啟動,如果還不成功,可以用innodb_force_recovery參數進行強制復原。除此之外,日誌也很重啟,有問題先看日誌。
以上是mysql innodb 異常修復過程實例的詳細內容。更多資訊請關注PHP中文網其他相關文章!