一、前言
前段时间在服务器部署java项目时为了兼容项目把MySQL5.7数据库换成了MySQL8.0,但是在删除MySQL5.7时,忘记备份原数据库文件了。但是我并没有删除数据文件,于是我需要根据mysql的data中保存的.frm、.ibd文件来恢复原数据库数据。
二、遇到问题
2.1 MySQL数据库的每张表都会以.frm和.ibd文件格式(InnoDB引擎)或.frm、.MYI和.MYD文件格式(MyISAM引擎)保存在data中,如果数据表使用的是MyISAM引擎,则恢复非常简单,只需要将包含数据文件的文件夹放到对应的位置即可,如果是InnoDB引擎,会复杂很多。我要恢复的数据库中两种结构都有。。。
2.2 网上教学的方法基本都适用于MySQL5.7,而MySQL8.0会遇到很多麻烦,就算是更简单的MyISAM引擎,也没有成功。包括后面使用MySQL Utilities 也会遇到问题,因此,我的建议是:1.使用MySQL5.7来恢复数据,备份sql文件,再重新安装MySQL8.0。2.如果你有另外一台电脑或服务器或虚拟机,或者你会使用docker,则可以在另一个系统中下载MySQL5.7进行操作。其中我比较推荐使用docker进行操作。(如果你有linux基础,可以稍微入门docker即可)
三、MyISAM引擎恢复数据
3.1 准备MySQL5.7的环境,根据我上面说的几种条件,符合一个即可。我这里介绍使用docker的方式。
3.11 拉取MySQL5.7镜像
$ docker pull mysql:5.7
3.12 创建一个数据库实例 挂载容器卷 设置端口号 设置root密码
$ docker run -d -p 3308:3306 -v /yune/mysql/log:/var/log/mysql -v /yune/mysql/data:/var/lib/mysql -v /yune/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:5.7
3.13 将要恢复文件夹放到msyql的data中,3.12中我给容器挂载了容器卷,因此我的目录就是宿主机的 /yune/mysql/data 下。
$ sudo cp 要恢复的文件地址 /yune/mysql/data
3.14 完成之后可以进入MySQL查看,发现你的数据库已经恢复了
$ docker exec -it mysql /bin/bash # mysql -uroot -p123456 show databases;
四、InnoDB引擎恢复数据
4.1 如果你的数据库中既包含MyISAM引擎的表也包含InnoDB引擎的表,就会发现通过上面的方式只能恢复MyISAM那部分表,而InnoDB的表只有表名而没有表结构和数据。如果想要恢复InnoDB的表,需要借助工具MySQL Utilities,如果没有可以去官网下载。接下来的操作借助可视化工具会简单,因此下面使用navicat + windows命令行的方式操作。
4.2 使用navicat远程连接数据库,根据数据库名创建要恢复的数据库,比如我这里要恢复apiadmin
打开数据库表,发现没有成功恢复的表只有表名,没有结构和数据。
4.3 找到需要恢复表的镜像文件 复制.frm文件路径
4.4 windows命令行执行下面代码,将frm文件转成sql文件。
mysqlfrm --server=root:123456@192.168.2.29:3309 frm文件路径\unit.frm > sql文件路径\unit.sql --diagnostic --port=3307
如果提示mysqlfrm是未知命令说明MySQL Utilities 没有安装或环境变量没有配好。
–server连接你的数据库 如果是msyql8这里会因为加密方式报错。
4.5 打开转成的sql文件,发现里面是数据库表的创建语句,其实.frm文件就是保存数据库表结构的文件。
alter table `unit` discard tablespace;
执行完发先文件夹中的unit.ibd文件重新生成。
4.9 打开unit表,发现数据已经成功恢复。
文章知识点与官方知识档案匹配,可进一步学习相关知识