您现在的位置: 365建站网 > 365学习 > MySQL innodb引擎下通过.frm和.ibd恢复数据

MySQL innodb引擎下通过.frm和.ibd恢复数据

文章来源:365jz.com     点击数:435    更新时间:2020-04-09 23:50   参与评论

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.导入表空间




如对本文有疑问,请提交到交流论坛,广大热心网友会为你解答!! 点击进入论坛


发表评论 (435人查看0条评论)
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
用户名: 验证码: 点击我更换图片
最新评论
------分隔线----------------------------