此方法只適合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導出;
當誤刪除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導出;