mysql誤刪數(shù)據(jù)庫(kù)表的frm文件和ibd文件?試試這樣恢復(fù)
之所以做這個(gè)實(shí)驗(yàn),也是有個(gè)朋友誤刪了某張表的frm和ibd文件,然后要導(dǎo)入數(shù)據(jù)的時(shí)候一直提示無(wú)法重新創(chuàng)建這張表,這時(shí)候應(yīng)該怎么解決呢?我們用一個(gè)實(shí)驗(yàn)來(lái)看看。。
以下ERROR 29 (HY000):
測(cè)試在t表表結(jié)構(gòu)不存在的時(shí)候插入數(shù)據(jù),發(fā)現(xiàn)可以插入成功
重啟之前得在其他數(shù)據(jù)庫(kù)新建t表結(jié)構(gòu),然后復(fù)制frm文件到原數(shù)據(jù)庫(kù)即可
因?yàn)閙yisam不需要記錄信息到數(shù)據(jù)字典,所以drop后重建就行了
此時(shí)t2表結(jié)構(gòu)和數(shù)據(jù)已經(jīng)恢復(fù)
可以發(fā)現(xiàn)修復(fù)不成功
考慮到在使用innoDB引擎的數(shù)據(jù)庫(kù)中,其實(shí)際數(shù)據(jù)不是存放在數(shù)據(jù)庫(kù)目錄下的,而是放在一個(gè)叫ibdata1的文件內(nèi)(默認(rèn)配置時(shí)),其目錄下只是放置了數(shù)據(jù)庫(kù)的表及表結(jié)構(gòu)相關(guān)的信息。這里在其他庫(kù)上建立t表及數(shù)據(jù),然后將這個(gè)表復(fù)制到test庫(kù)下
拷貝后發(fā)現(xiàn)還是沒(méi)有恢復(fù)成功
升級(jí)后還是沒(méi)有恢復(fù)成功
因?yàn)楣蚕肀砜臻g記錄了信息
配置文件的一個(gè)參數(shù):innodb_force_recovery
innodb_force_recovery 會(huì)影響整個(gè)InnoDB存儲(chǔ)引擎的恢復(fù)狀況。默認(rèn)為0,表示當(dāng)需要恢復(fù)時(shí)執(zhí)行所有的
innodb_force_recovery可以設(shè)置為1-6,大的數(shù)字包含前面所有數(shù)字的影響。當(dāng)設(shè)置參數(shù)值大于0后,可以對(duì)表進(jìn)行
select,create,drop操作,但insert,update或者delete這類操作是不允許的。
1、在mysql庫(kù)創(chuàng)建t表及數(shù)據(jù)
2、停止數(shù)據(jù)庫(kù)
3、復(fù)制frm和ibd文件
4、修改參數(shù)
5、兩次啟動(dòng)數(shù)據(jù)庫(kù)
啟動(dòng)mysql,再關(guān)閉mysql 把配置innodb_force_recovery = 6給刪除了,然后啟動(dòng)mysql
6、drop 表后重建
提示ERROR 1813 (HY000): Tablespace '`test`.`t`' exists或ERROR 1813 (HY000): Unknown error 1813都是表空間問(wèn)題
此時(shí)只需要?jiǎng)h除對(duì)應(yīng)的.ibd文件即可或者alter table t discard tablespace;來(lái)刪除
1、誤刪數(shù)據(jù)文件時(shí)不要忙著重啟數(shù)據(jù)庫(kù),先查看表是否存在,做一下備份
2、定期備份是很重要的
3、以上innodb表實(shí)際上只恢復(fù)了表結(jié)構(gòu),表數(shù)據(jù)并沒(méi)有恢復(fù),可以考慮通過(guò)mysqlbinlog進(jìn)行回退
覺得有用的朋友多幫忙轉(zhuǎn)發(fā)哦!后面會(huì)分享更多devops和DBA方面的內(nèi)容,感興趣的朋友可以關(guān)注下~
下一篇:mysql連接報(bào)“Communications link failure”錯(cuò)誤