mysql 之 frm+ibd文件還原data


 
此方法只適合innodb_file_per_table          = 1 
當誤刪除ibdata 該怎么辦? 如下步驟即可恢復: 
1、准備工作 
1)准備一台純潔的mysql環境【從啟動到現在沒有使用過INNODB的表結構的mysql環境】(當然也可以不用純潔的,但是一定要保證表id 小於后續要恢復的表id); 

2)備份frm、ibd文件; 

2、通過frm恢復表結構 
1)在測試庫里新建任意一表,表結構隨意,表名必須為:要恢復數據的表名【即為frm前綴名】 

例如:CREATE TABLE five_monitor (id int(11) NOT NULL ) ENGINE=InnoDB ; 

2)關閉mysql 

3)用需要恢復的frm文件直接替換測試庫剛新建的frm文件; 

4)在配置文件里添加innodb_force_recovery = 6,然后啟動; 

5)show create table  five_monitor;即能看到你需要的表結構信息了; 

6)然后去掉innodb_force_recovery = 6 設置,重啟mysql為下一步做准備; 

3、通過ibd恢復表數據 
1)查看表的space id(  http://haildb.sourcearchive.com/ ... 0fil_8h_source.html   00118有說明) 

a: hexdump -C five_monitor.ibd |head -n 3 |tail -n 1|awk '{print $6$7}‘ 



b: 通過以上結果到mysql里面去轉成10進制:select conv('67c0',16,10); 



說明space id為:26560 

2)新建innodb表補充ibdata里面的table id 

如果想看到ibd里面的數據,我們必須讓space id 與剛啟動的mysql ibdata里面的記錄的表id一致; 

新建一個表innodb,ibdata里面的表id就會+1,而剛才已經新建過表了,所以id已經+1了 

故我們還需要新建26560-1(剛才新建的)-1(要恢復的表)=26558個表 

for i in `seq 0 26557`; do mysql --user=××× ×××××  -e "CREATE TABLE iinser$i (id bigint(20) NOT NULL AUTO_INCREMENT,PRIMARY KEY (id)) ENGINE=innodb "; done 

3)導入要恢復的表 

a:在另外一個測試庫里按照第2步導出的表結構新建表; 

b:alter table   five_monitor discard tablespace; 

c:cp 要恢復的ibd 到剛建的表的目錄里,並修改mysql權限 

d:alter table   five_monitor import tablespace; 

4)在配置文件里添加innodb_force_recovery = 6,然后啟動; 

這樣你就能看到你想要的數據了。當然一定要通過dump 或者select * from into outfile把data導出; 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM