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檔案命令是錯的,我被坑了一下