注意:红色字为需要修改为自己配置的地址、库名、表名等信息的地方。
灰色字的部分mysql5.6.8版本以上的不需要考虑。
1、有一个数据库,数据库中有一个和需要恢复的表的表名和表结构相同的表。
比如,需要恢复数据的表是test,那你的数据库中就需要有一个表结构相同的test表。
2、找到记录点。
linux命令:根目录下: /usr/mysql/data/数据库名字(msql安装的地方)
3、先要把当前数据库的表空间废弃掉,使当前ibd的数据文件和frm分离。
sql:ALTER TABLE test(执行完sql后,表现为表的ibd文件被删除,但是千万不要自己手动删除 )
3.1、如果sql报错,尝试执行以下过程。
停止mysql服务,
添加innodb_force_recovery=1【innodb_force_recovery】
启动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版本之后,增加了alter table test for export命令,可以使导出的idb文件保持一致状态,并且生成文件.cfg后缀文件。当我们需要单表复制的时候,直接拷贝.frm/.idb/.cfg文件
在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
t_test.ibd文件到数据库的目录下
修改t_test.ibd文件的权限。
linux命令:chown -R mysql:mysql t_test.ibd
可以查看一下文件权限是否从root改为mysql。
linux命令:ll |grep t_test.ibd
5、把之前要恢复的 .ibd文件复制到新的表结构文件夹下。 使当前的ibd 和frm发生关系。
sql:ALTER TABLE test IMPORT TABLESPACE;
5.1、如果之前使用了alter table test for export命令,这里则需要记得unlock tables释放该锁
6、数据就恢复好了,正常查看即可。