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查看数据表,你会发现数据已经成功恢复啦啦啦。