前言

这里是小改,相信大家在使用 WordPress 的时候可能会存在一些不良习惯,包括但不限于:不备份资料就乱搞,也不看看所需要安装的软件与原有环境冲不冲突,就一股脑的 "Copy→Paste→Enter" ,以至于最后 MySQL 不能正常使用时,我正准备尝试备份,结果备份失败了,重新安装需要删除原有的数据库,这就犯了难。

but,如果我们用的是宝塔的话,翻翻目录就会发现在某个目录(/www/server/data)里有着 ".frm" 和 ".ibd" 文件,今天教大家如何使用 ".ibd" 文件恢复 MySQL 数据表数据。

背景

我原先想在服务器上部署一个 OJ 系统,奈何技术有限没啥实力只能乱搞,以至于与原先的环境有了冲突,我访问博客发现我博客便访问不了了,宝塔那边数据库也无法备份(因为数据库无法正常启动便备份不了了),卸载重装数据库又需要删库,这使我犯了难,我翻了下目录后便找到了一些 ".frm" 和 ".ibd" 文件。

由于我博客早就不像之前一样是个摆设品了,里面有很多文章和图片,所以为了尽可能的去恢复资料我便先将博客的数据表打包了下来。

我当时的具体情况可见:【25年22周记】记一次事故与修复过程 – 小改学习志

简要介绍

小学三年级的信息课中有讲过,在MySQL中,使用默认的存储引擎 innodb 创建一张表,那么在那个库名文件夹下面就会出现 表名.frm 和 表名.ibd 这两个文件。

这两个文件中,.frm 文件是 innodb 的表结构文件,.ibd 文件是 innodb 的表数据文件。WordPress 是一个很典型的博客系统,我们使用的大多数主题,并不会去大量的动数据表以及数据包结构,这为我们能够恢复数据奠定了一个良好的基础。

由于 .frm 文件恢复数据库的方法十分复杂况且基本上大多数站点使用的都是类似于 WordPress 这类的系统,大多数主题开发者也不会动太多的数据库,我们这篇文章只介绍使用 .ibd 文件恢复数据库内数据。

方法声明

我此处使用 .ibd 文件的原因是我网站所使用的主题并没有动数据表结构,所以数据表结构是跟原先没有差异的,可以直接使用 .ibd 文件恢复的。

如果你不确定你原先的数据表结构跟你原站有没有差异,我建议你参考这篇文章:MySQL 利用frm文件和ibd文件恢复表结构和表数据 - 月巴左耳东 - 博客园,以免出现一些不必要的麻烦。

(我的博客也是在当时看了 "月巴左耳东" 大佬的文章后修复的,本篇文章更像是一篇笔记复盘记述我在恢复数据库数据时的方法)

操作方式

这种使用 .ibd 文件恢复数据的方法十分简单粗暴,方法如下:

step 01. 新建数据库并重新安装WordPress

我们先把目录里网站数据库里的 ".frm" 和 ".ibd" 文件全部下载下来,然后再删库(一般情况下目录名就是数据库名)。

此时再建一个数据库,记住不要删除原网站的文件,虽然数据库没了但是网站里的一些内容还在原网站目录里(比如上传了的图片)

在动 wordpress 目录前,为了防止出现一些其他的事情,导致目录里的内容都丢了,强烈推荐先把网站目录里的文件下载到你本地,以便后面出现状况后能够有个备份。

此时,修改原先网站目录里的 wp_config.php,把原先数据库信息改成新建的数据库信息,然后再访问按照操作重新安装 wordpress ,安装完 wordpress 后切到我们之前博客所使用的主题。

step 02. 使用 .ibd 文件恢复表数据

进入我们新创建的那个数据库,删除原先所有表的 ibd 文件:

alter table name discard tablespace;

(此处的 "name" 是用于举例的表名,在删除数据库时所有表的 ibd 文件时,你需要替换成你实际的表名并重复这样的操作)

然后将原先的 .ibd 文件上传到对应的数据库目录中(也就是新建的数据库),一般情况下目录名就是数据库名,然后使用下面的命令将数据加载到MySQL数据库里:

alter table name import tablespace;

(此处的 "name" 是用于举例的表名,你需要替换成你实际的表名并重复这样的操作)

(注意一下替换文件后的 .ibd 文件的权限)

然后你会发现,此时你的数据回来了,网站理论上可以正常访问了。

最后的话

数据无价,与其在这傻傻折腾,不如养成备份的好习惯。如果有备份的习惯的话,也不至于去查这么多教程去尽力恢复博客数据。

从那次博客数据丢了后侥幸用此方法恢复,我也长了记性,现在基本上每天都会对博客进行备份。

时间也不早了,晚安~