frm+ibd文件還原data

此方法只適合innodb_file_per_table          = 1
當誤刪除ibdata 該怎麼辦? 以下步驟便可恢復:
一、準備工做
1)準備一臺純潔的mysql環境【從啓動到如今沒有使用過INNODB的表結構的mysql環境】(固然也能夠不用純潔的,可是必定要保證表id 小於後續要恢復的表id);

2)備份frm、ibd文件;

二、經過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爲下一步作準備;

三、經過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導出;
相關文章
相關標籤/搜索