注意:红色字为需要修改为自己配置的地址、库名、表名等信息的地方。
灰色字的部分mysql5.6.8版本以上的不需要考虑。
1、有一个数据库,数据库中有一个和需要恢复的表的表名和表结构相同的表。
比如,需要恢复数据的表是test,那你的数据库中就需要有一个表结构相同的test表。
2、找到记录点。
3、先要把当前数据库的表空间废弃掉,使当前ibd的数据文件和frm分离。
sql:ALTER TABLE test DISCARD TABLESPACE;(执行完sql后,表现为表的ibd文件被删除,但是千万不要自己手动删除 )
3.1、如果sql报错,尝试执行以下过程。
停止mysql服务,
添加innodb_force_recovery=1【innodb_force_recovery的含义参考:http://blog.csdn.net/u012887385/article/details/54406489】,
启动mysql服务。
3.2、如果报错Error Code: 1808. Schema mismatch (Table has ROW_TYPE_DYNAMIC row format, .ibd file has ROW_TYPE_COMPACT row format.)
则在建表语句后加上 ROW_FORMAT=COMPACT
3.3、在MySQL 5.6之前,导入单个innodb表的idb文件需要对齐tablespace id,而如果tablespace id不一致,就需要通过在新库不挺的新建表,来增长tablespace id,以致对齐tablespace id。
在5.6.8之后,可以不需要生成cfg文件,直接复制idb文件和结构文件即可进行导入!但是会生成如下警告:
Warning Code : 1810
InnoDB: IO Read error: (2, No such file or directory) Error opening './test/t_test.cfg', will attempt to import without schema verification
4、复制备份的t_test.ibd文件到数据库的目录下
修改t_test.ibd文件的权限。
linux命令:chown -R mysql:mysql t_test.ibd
可以查看一下文件权限是否从root改为mysql。
5、把之前要恢复的 .ibd文件复制到新的表结构文件夹下。 使当前的ibd 和frm发生关系。
sql:ALTER TABLE test IMPORT TABLESPACE;
5.1、如果之前使用了alter table test for export命令,这里则需要记得unlock tables释放该锁
6、数据就恢复好了,正常查看即可。