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.導入表空間
如對本文有疑問,請提交到交流論壇,廣大熱心網友會為你解答??! 點擊進入論壇