1. 程式人生 > >MySQL使用frm和ibd檔案恢復資料

MySQL使用frm和ibd檔案恢復資料

本文所述內容,均是本人親測,並非複製貼上轉載

環境:CentOS 6 X64

MySQL 5.6.36

獨立表空間(my.cnf中 innodb_file_per_table = 1)   否則無法恢復

情景描述:

由於操作人員對伺服器,直接物理重啟,導致MySQL無法啟動

檢視錯誤日誌顯示mysql的資料檔案中ibdata1檔案損壞,導致無法啟動

於是開始從百度上搜各種解決方法,不知道那些人是怎麼操作的,直接把系統庫重新初始化,然後就沒有下文了!

重新初始化系統庫,MySQL是可以正常啟動,但是以往的資料庫是不能用的,不知道那些人是怎麼用的。。。。

解決方法:

第一步:重新初始化系統庫,當然最好換一個目錄

例如我的MySQL資料目錄在/data/mysql     那就新建一個目錄,或者把mysql備份

一下,然後把目錄中的檔案全部刪除,空目錄

到mysql安裝目錄/usr/local/mysql/scripts下執行初始化指令碼  :  

 ./mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql_data       #mysql_data是新建的目錄,也可以用原來的目錄

第二步:重新設定mysql的root密碼等,和遠端連線設定,啟動MySQL

第三步:新建資料庫,最好是跟之前的資料庫名相同,不相同應該也可以,匯入之前的資料庫表,有無資料無所謂(我只導了空表進去)

第四步:關閉MySQL,然後複製要恢復的資料庫表的ibd檔案

cp -rp /data/mysql/callcenter/cdr.ibd /home/back/cdr.ibd   #備份過的ibd檔案

cp -rp /data/mysql_data/callcenter/cdr.ibd  /home/install/cdr.ibd   #新生產的ibd檔案

第五步:編輯ibd檔案

cd /home/install/   

vi -b cdr.ibd      #以16進位制開啟檔案


命令列下輸入: %!xxd   轉換成16進位制顯示



記下0000020那一行的第3列和第5列的值

我們將要恢復資料的cdr.ibd的值改成與新建表的ibd檔案中的值相同,否則會提示表不存在

修改完後,命令列模式下輸入 :%!xxd -r  返回原來的顯示方式,執行儲存退出(修改的是要恢復的檔案,不是新生成的)


修改完成後,覆蓋現有的ibd檔案

cp /home/back/cdr.ibd /data/mysql_data/callcenter/   

第六步:修改my.cnf   新增

innodb_force_recovery=6


啟動MySQL後,就可以看到以前的表資料了,使用mysqldump工具把資料匯出來

恢復新的ibd檔案,把innodb_force_recovery=6註釋掉,啟動mysql就ok了

其他情況,請參照 http://blog.csdn.net/ys1109/article/details/40187217   這篇文章的編輯ibd檔案命令是錯的,我被坑了一下