如何通过frm文件和ibd文件恢复MySQL数据库表内的内容?

首先先情景说明一下,本教程仅适用于innod引擎的数据库,在使用本教程恢复数据库的前提是你的数据库frm文件和ibd文件全部导出,且没有损坏。

数据无价,还是建议各位勤备份的好。

准备工作

我们首先需要先在服务器上部署好MySQL数据库环境,部署的MySQL数据库版本最好和之前的数据库版本相同,如果数据库版本不同我也无法保证会不会出现一些未知的错误。

我使用的是宝塔面板,所以接下来我将用宝塔给大家演示。(主要是宝塔对不会Linux的人来说比较友好。)

数据库恢复的原理

1.获取frm文件的表结构(create table)

2.将原数据库的ibd文件替换新创建的ibd文件

获取table的方法,即获取表结构的方法

我这里推荐大家使用dbsake,这个工具非常好用。

curl -s get.dbsake.net > dbsake

输入上面这条命令即可下载dbsake工具,一般工具会安装到root目录下。

然后运行chmod u+x dbsake给dbsake权限。

最后运行这个命令即可获取表结构

1
./dbsake  frmdump  [frm-file-path]

pCzTIOg.png

运行效果如上。

下面的

CREATE TABLE text (
name int(255) NOT NULL COMMENT '繁花教程测试数据库',
123 int(122) NOT NULL COMMENT '繁花教程',
id int(40) NOT NULL COMMENT '繁花教程',
url int(60) NOT NULL COMMENT '繁花教程'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

部分就是我们要的表结构了。

准备完毕,教程开始!

第一步,我们先新建一个数据库。

这个步骤跳过,宝塔面板新建数据库非常简单。

第二步就是通过ssh连接上服务器后进入mysql

连接上服务器后在控制台输入:

mysql -u root -p

然后再输入你数据库的root密码即可进入mysql数据库的控制台。

pCz7ikR.png

然后在mysql命令台输入

use [数据库名称]

即可进入对应的数据库。

pCz7G1f.png

我这里新建了个text数据库作为测试。

第三步按照原数据库表结构创建新表

然后我们将之前获取的表结构直接粘贴进去,回车。

pCz7a7j.png

提示这个也就算成功了,现在原本空的数据库会出现一个新的表,但是这个表是空的,并没有我们之前数据库的表的内容。

第四步删除新建表的ibd文件

我们接下来需要删除新建表的ibd文件。

alter table 表名称 discard tablespace;

在mysql控制台输入上面的命令即可。

pCz7buD.png

第五步,上传原数据库的ibd文件到数据库目录下

数据库目录宝塔的一般为

/www/server/data/数据库名称

宝塔在Linux环境下是这个目录。

第六步让上传的ibd文件和frm文件产生关联

我们需要让新上传的ibd文件和frm文件产生关联,否则数据库会报错。

报错效果如下:

pCz7jUA.png

pCz7XEd.png

我们只需要在控制台输入:

alter table wp_zrz_order import tablespace;

结尾

到这里教程就结束了,因为按照以上的教程数据库的表就可以恢复了!

如果出现了其他的报错可以尝试修改ibd文件的作者为mysql。

chown -R mysql.mysql wp_zrz_order.ibd

用上面这个命令就可以了。

感谢你看完了这篇教程,最后祝你好运!

如果这个教程真的帮助到了你,你是否能请我喝瓶可乐呢?(下面有打赏按钮哦,疯狂暗示,嘿嘿。)

我们下期教程再见!

对了,如果你要修复的表比较多,我这里给你个批量获取表结构的命令。

find 文件目录 -type f -name “*.frm” -exec ./dbsake frmdump {} ;

示例如下:

find /www/sql/wpqingjuacg/ -type f -name “*.frm” -exec ./dbsake frmdump {} ;

补充

带MYD和MYI文件的表你只需要通过表结构创建好新表之后,在数据库目录下删除新建的MYD和MYI文件,然后将原数据库的MYD和MYI文件上传即可。