针对mysql 5.7.20 数据恢复

环境介绍:
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的原因

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

你可能感兴趣的:(mysql)