一、背景

1.1、问题来源

找了个开源项目,发现没有sql文件,只有.frm文件和.ibd文件,想要通过这些文件恢复数据库表结构以及数据。

1.2、环境介绍

数据库版本:MySQL 5.7

数据库表引擎:innodb

二、解决方案

2.1、准备工作

  • 进行数据恢复的表.frm和.ibd文件

  • 新创建一个数据库db_demo

2.2、表结构恢复

  • 创建一个相同名字的表user,字段随意
CREATE TABLE `user` (
  `id` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  • 关掉MySQL服务
net stop mysql
  • 把准备的user.frm文件复制到MySQL的data/db_demo文件夹,并覆盖原来的.frm文件

  • 启动MySQL服务
net start mysql
  • 在sql窗口执行语句
FLUSH TABLES;

SHOW CREATE TABLE `user`; 

  • 找到MySQL的错误日志
SHOW VARIABLES LIKE 'log_error';

  • 打开错误日志

  • 从错误日志可以看出,user表有6个字段,删除user表,再重新创建,随意新增6个字段
DROP TABLE `user`;

CREATE TABLE `user` (
  `1` varchar(255) DEFAULT NULL,
  `2` varchar(255) DEFAULT NULL,
  `3` varchar(255) DEFAULT NULL,
  `4` varchar(255) DEFAULT NULL,
  `5` varchar(255) DEFAULT NULL,
  `6` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  • 重复前面的2-4步骤,即可得到user表原来的结构

2.3、表数据恢复

  • 删除user表重建
DROP TABLE `user`;

CREATE TABLE `user` (
  `userID` varchar(50) NOT NULL,
  `password` varchar(50) NOT NULL,
  `nickname` varchar(50) DEFAULT NULL,
  `userLevel` varchar(50) DEFAULT NULL,
  `erollTime` datetime DEFAULT NULL,
  `accountBalance` decimal(10,2) DEFAULT NULL,
  PRIMARY KEY (`userID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
  •  关掉MySQL服务
net stop mysql
  • 把准备的user.ibd文件复制到MySQL的data/db_demo文件夹,并覆盖原来的.ibd文件

  • 启动MySQL服务
net start mysql
  • 执行语句,恢复成功
ALTER TABLE `user` IMPORT TABLESPACE;

SELECT * FROM `user`;

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐