大堆的字尾為.frm、.opt、.myi、myd的MySql資料檔案匯入Mysql
mysql根據.frm.idb恢復資料表和資料(版本:MYSQL5.7.20)
總體分為兩部分:
1.恢復資料表結構
a.根據要恢復的資料庫建立一個新的同名數據庫建立一個同名的資料表,因為不知道表的結構,表內的資料隨便建立一個就行
簡單的例子:我要恢復名為:animalhealth的資料庫 名為:tb_breed.frm表
命令列程式碼:
mysql>create database animalhealth;
QueryOK, 1 row affected (0.00 sec)
mysql 的data目錄下會有一個animalhealth資料夾
mysql>use animalhealth;
Databasechanged
mysql>create table tb_breed (id int)ENGINE=InnoDB DEFAULT CHARSET=utf8;
QueryOK, 0 rows affected (0.33 sec)
之行結束後mysql 的data目錄下如圖所示
然後停止mysql服務
然後將要恢復的.frm檔案複製過來覆蓋剛剛建立的.frm檔案
在my.ini裡增加innodb_force_recovery=4這句,如果有就改成4,4不行換其他1-6.
然後儲存重啟資料庫
然後查看錶裡的內容出現這個錯誤
針對這個問題,我們可以通過檢視mysql的日誌檔案來解決,檢視mysql安裝目錄下的data資料夾裡面.err結尾的檔案,你會發現出現下面所示的錯誤資訊:[Warning] InnoDB: Table wangyi/songlyric contains 1 user definedcolumns in InnoDB, but 6 columns in MySQL.原來是因為,我們要恢復的表有6個欄位,而我們在建立表的時候只建立了1個欄位。
解決方案:刪除songlyric表重新建立一個包含6個欄位的表,具體這6個欄位是什麼不用管的。具體執行過程為使用net stop mysql停掉服務,然後在配置檔案my.ini中將innodb_force_recovery = 6註釋掉(#或;均可),再net start mysql啟動服務。接著在控制檯先執行drop tablesonglyric;刪除表,再執行建立表語句,我執行的是下面的建立表語句:create tablesonglyric(id int,id1 int,id2 int,id3 int,id4 int,id5 int);
緊接著按照前面的方式,使用net stopmysql關閉資料庫服務,然後用需要恢復的songlyric.frm覆蓋這個新建的wangyi資料庫的songlyric表的物理檔案songlyric.frm,接著對配置檔案(my.ini)設定innodb_force_recovery = 6,然後使用net start mysql啟動服務,接著使用:descsonglyric檢視該表結構,輸出下面結果表示恢復表結構成功:
mysql> show create table tb_breed;
| Table | Create Table |
+----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tb_breed | CREATE TABLE `tb_breed` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`BreedName` varchar(255) DEFAULT NULL,
`IntelliSense` varchar(255) DEFAULT NULL,
`TimeStamps` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATECURRENT_TIMESTAMP,
`IsDelete` tinyint(4) DEFAULT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set, 1 warning (0.12 sec)
再然後刪除剛才的表mysql> drop table tb_breed;
在my.ini裡innodb_force_recovery=4這句前面加上分號註釋掉
根據剛才恢復的表結構建立一個新表,建表語句後加上 ROW_FORMAT=COMPACT
CREATE TABLE `tb_breed` (
-> `ID` int(11) NOT NULLAUTO_INCREMENT,
-> `BreedName` varchar(255)DEFAULT NULL,
-> `IntelliSense`varchar(255) DEFAULT NULL,
-> `TimeStamps` timestampNULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
-> `IsDelete` tinyint(4)DEFAULT NULL,
-> PRIMARY KEY (`ID`)
-> )ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
新表建立成功後關閉mysql
在my.ini裡innodb_force_recovery=4這句前面加上分號去掉
2.恢復資料
恢復表資料需要首先將原先的.ibd檔案與原先的.frm檔案解除繫結,具體就是在控制檯執行下面命令:
alter table “要恢復的資料庫名” discard tablespace; 接著執行net stop mysql停掉服務,將需要恢復的.ibd檔案覆蓋這個新建的資料庫的表的物理檔案.ibd,執行net start mysql開啟服務。 將複製過來的“要恢復的檔案的”.ibd檔案與“要恢復的檔案的”.frm檔案發生聯絡。具體執行下面命令:
alter table “要恢復的資料庫名” import tablespace; 這時候通過navicat檢視資料表,你會發現資料已經成功恢復啦啦啦。