您現在的位置: 365建站網 > 365學習 > MySQL innodb引擎下通過.frm和.ibd恢復數據

MySQL innodb引擎下通過.frm和.ibd恢復數據

文章來源:365jz.com     點擊數:1400    更新時間:2020-04-09 23:50   參與評論

mySQL存儲在磁盤中,各種天災人禍都會導致數據丟失。大公司的時候我們常常需要做好數據冷熱備,對于小公司來說要做好所有數據備份需要支出大量的成本,很多公司也是不現實的。萬一還沒有做好備份,數據被誤刪除了,或者ibdata損壞了怎么辦呢?別擔心,只要有部分的frm、ibd存在就可以恢復部分數據。

今天向大家分享下mysql通過.frm和.ibd文件恢復數據的方法,因為之前電腦換系統的原因,忘記備份數據庫,最后只能通過恢復工具找到數據庫的.frm和.ibd文件,為了恢復數據,今天踩了不少坑,下面把我成功恢復的過程分享給大家;


整個恢復過程其實可以總結為下面幾步:

(1):恢復表結構

(2):復制出來創建表的sql語句

(3):恢復表數據(在恢復表數據的時候,首先需要解除當前創建的表與默認生成的.ibd文件間的關系,接著將要恢復數據表的.ibd文件與當前創建的表聯系起來即可)

做法步驟1--將原先的.ibd文件與原先的.frm文件解除綁定
做法步驟2--停掉服務,新的.ibd文件覆蓋舊的.ibd文件,再開啟服務
做法步驟3--將新的.ibd文件與.frm文件發生聯系

.frm文件:保存了每個表的元數據,包括表結構的定義等;

.ibd文件:InnoDB引擎開啟了獨立表空間(my.ini中配置innodb_file_per_table = 1)產生的存放該表的數據和索引的文件。

1、安裝相同版本的mysql;

找回表結構

2、找回表結構(若有表結構,直接導入表即可)

  • 建立同名的表(InnoDB),不知道列數的話隨意一個字段即可(如果字段個數不一致會報錯,去日志文件中查看有列數重復這些步驟)

  • 關閉mysql服務

  • 用需要恢復的.frm文件覆蓋新生成的.frm文件。

  • 修改my.ini配置innodb_force_recovery = 6進入恢復模式(只讀)。

  • 啟動mysql服務。

  • desc tble_name或者show create table tbl_name獲取創建表結構語句。(直接查看表設計字段會導致數據庫異常)

  • 復制建表sql,刪除表(不能直接刪.frm和.ibd會導致新建時報已存在,如果直接刪除文件,需要將frm文件拷貝回來,再drop表),執行sql創建表結構。(這個步驟要把innodb_force_recovery = 6注解掉或者回復為0,不然提示只讀)。

 這里會出現啟動后沒有表結構,這是需要查看mysql的日志文件

找到日志文件位置:

show variables like '%error%'

這里的.是相對于mysql的,windows可以根據快捷方式找到mysql位置然后再找.err錯誤文件

找到報錯信息為

2018-12-18T08:52:30.314230Z 2 [Warning] InnoDB: Table bookkeeping/concategory contains 1 user defined columns in InnoDB, but 3 columns in MySQL.

意思是新建的有1列,但是復制過來的frm文件中含有3列。這時候知道列數,重做上述步驟。

 

恢復數據 

刪除新建的表空間

單個執行刪除表空間語句

ALTER TABLE <table_name> DISCARD TABLESPACE;

批量刪除空間,執行以下語句。

SELECT CONCAT('ALTER TABLE ', table_name, ' DISCARD TABLESPACE;') FROM information_Schema.TABLES WHERE TABLE_SCHEMA =  'db_name';

獲得每個表的刪除表空間語句,直接全部選中復制(Navicat)

在前后加上外鍵約束檢查關閉和開啟執行

2.將待恢復的<table_name>.ibd文件copy到目標數據庫文件夾下(這時候在navicat中看不到表名,不要慌?。?!),并修改文件權限(chown u:g file),批量修改權限chown mysql:mysql /usr/mysql/data/db_name/*

導入表空間

單個執行導入表空間語句

ALTER TABLE <table_name> IMPORT TABLESPACE;

批量導入表空間

SELECT CONCAT('ALTER TABLE ', table_name, ' IMPORT TABLESPACE;') FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'db_name';

這里和刪除一樣,不贅述,復制所選語句,加上關閉開啟檢查,執行

可能出現問題

1.mysql 1808錯誤:這是由于mysql 5.6的文件恢復到mysql 5.7版本導致的錯誤,需要在建表語句后面添加ROW_FORMAT=COMPACT

2.mysql 1812錯誤:copy的ibd文件沒有賦權,用chown u:g file

3.mysql 1451錯誤: Cannot delete or update a parent row: a foreign 

在前后加上

SET foreign_key_checks = 0; -- 先設置外鍵約束檢查關閉SET foreign_key_checks = 1; -- 開啟外鍵約束檢查,以保持表結構完整性

 

總結

1.建立表結構(有備份直接用,跳過第一步的找回表結構) 

2.刪除新建的表空間

3.拷貝.ibd數據文件覆蓋新建的文件

4.導入表空間




如對本文有疑問,請提交到交流論壇,廣大熱心網友會為你解答??! 點擊進入論壇


發表評論 (1400人查看,0條評論)
請自覺遵守互聯網相關的政策法規,嚴禁發布色情、暴力、反動的言論。
用戶名: 驗證碼: 點擊我更換圖片
最新評論
------分隔線----------------------------
自拍偷拍福力视频,偷拍国际精品,麻豆一区福利电影,国产网红视频午夜福利,se视频大全,久久国产AV影院 马未都开讲啦视频在线播放| free性欧美婬妇| 中国农村自拍hdxxxx| 欧美 在线 成 人| 香蕉视下载app最新版ios| 一炕四女| 在线精品自偷自拍无码| h成人18禁动漫在线看网站| 蜜中蜜3在线观看视频| 成年无码高潮喷水av片| 日本视频网站www色| 精品亚洲成a人在线观看| 在线看片免费人成视频影院看| 香蕉久久国产超碰青草| 免费无码午夜理论电影| a级亲伦小说| 神马影视在线2018| 下面一进一出好爽视频| 亚洲欧美日韩国产精品一区二区| 亚洲成av人片在线观看无| 亚洲av日韩av不卡在线观看| 老司机最新福利更新| 在线高清理伦片| 婷婷丁香| 国产精品久久这里都是精品| 中国xxxx片免费| 黑人性较视频免费视频| 快点快弄我哦我不了了| 快播电影| 午夜电影| yy6080新觉视在线影院无敌马| http://www.cloos-up.com