针对mysql 5.7.20 数据恢复

本文介绍了在缺少ibdata和ib_logfile文件的情况下,如何通过.idb和.frm文件恢复MySQL 5.7.20的数据库结构和数据。首先,创建相同环境并重建数据结构,然后通过特定命令解除.ibd和.frm文件的绑定来恢复表数据。强调了数据库备份的重要性,尤其是当面临数据丢失时。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

环境介绍:
mysql 独立存储空间,采用innodb引擎。
恢复分为两部分:数据结构和数据
我们可以拿到的文件只有数据库中的.idb 和.frm 文件,并没有ibdata 以及ib_logfile文件
第一、首先恢复数据结构
搭建相同的数据库环境,新建test数据库,新建一张表,表名和我们要恢复的表的名称一样;例如tbl_user

-- create table songlyric(id int);   //新建tbl_user表
-- 随后我们停止mysql服务,将备份出来的frm去覆盖新生成frm文件;同时修改my.ini文件配置innodb_force_recovery = 6;
-- 启动mysql服务,进入相应数据库 desc tbl_user; 会报错如下:
       ERROR 1146 (42S02):Table 'test.tbl_user' doesn't exsit

--  查看mysql报错日志 会看到错误信息[Warning] InnoDB: Table test/tbl_user     contains 1 user defined columns in InnoDB,but 6 columns in Mysql.
    原因在于 要恢复的表中有6个字段,而我们创建的表只有一个字段。
    解决方案:停止mysql 服务 注释my.ini 配置文件中的innodb_force_recovery = 6,否则 你直接去删除表的话,会报错 read-only相关错误。删除后我们在重新创建6个字段的新表create table tbl_user(id int,id1 int,id2 int,id3 int,id4 int,id5 int);随之去掉配置文件的注释,重启 为确保万一 重新覆盖frm文件,完成后查看desc tbl_user;
----------
    desc tbl_user;
    CREATE TABLE `tbl_user` (
  `id` int(10) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
  `user_name` varchar(50) DEFAULT NULL COMMENT '用户账号',
  `password` varchar(32) DEFAULT NULL COMMENT '用户密码',
  `pass` varchar(50) DEFAULT NULL COMMENT '密码--非加密',
  `display_name` varchar(50) DEFAULT NULL COMMENT '显示名称,联系人',
  `profile_photo` varchar(512) DEFAULT NULL COMMENT '用户头像',
  PRIMARY KEY (`id`),
  UNIQUE KEY `user_name` (`user_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户表' ROW_FORMAT=COMPACT;   //这里本身是没有的 ,后面恢复数据需要加上的

这里数据结构已恢复成功了,我们只需重建新表即可。


第二、恢复数据
恢复表数据需要首先将原先的.ibd文件与原先的.frm文件解除绑定,具体就是在控制台执行下面命令:

alter table tbl_user discard tablespace; 
接着执行net stop mysql停掉服务,将需要恢复的tbl_user.ibd文件覆盖这个新建的huifu数据库的tbl_user表的物理文件tbl_user.ibd,
执行net start mysql开启服务。 
将复制过来的tbl_user.ibd文件与tbl_user.frm文件发生联系。具体执行下面命令:
alter table tbl_user import tablespace; 这时候通过navicat查看数据表,你会发现数据已经成功恢复啦啦啦。
----------
在数据库下根据之前的建表语句创建表
alter table tbl_user import tablespace;
如果报错11:01:37    ALTER TABLE tbl import TABLESPACE    Error Code: 1808. Schema mismatch (Table has ROW_TYPE_DYNAMIC row format, .ibd file has ROW_TYPE_COMPACT row format.)    0.172 sec
则在建表语句后加上  ROW_FORMAT=COMPACT
这就是为什么在数据结构恢复后,建新表的时候加上ROW_FORMAT=COMPACT的原因

至此,数据恢复工作已经完成,感受就是数据库一定要有备份,否则出了问题很麻烦。虽然这次发生的情况是测试环境,但还是一个教训。
后面会尝试写个脚本自动回复,对于表数量小还好说,大的话 就不行了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值