Hi!请登陆

宝塔面板利用frm和ibd文件恢复Mysql数据

2020-10-24 78 10/24

写这篇文章我是非常不情愿的,我现在是在写这篇文章,但是同时我也在恢复我服务器数据库的数据,出这篇文章也是在我的意料之外,由于我正在这件事类,我就出一版这样的mysql.frm.ibd文件数据恢复教程,希望这次教程可以帮助到更多需要恢复的人,我现在是情绪暴涨

我先说一下我的服务器崩溃经过,wordpress博客网站,宝塔输入了rm指令导致全服务器文件被删完,因为我是阿里云的服务器,所以我可以去找那边的工程师来达到紧急修复(这里也建议在商业化云服务那里购买主机的人一旦出现问题就找服务商工程师),他们解决的很快,原本我以为服务器文件都删除了的,一切都不剩,但是经过了和工程师共同的努力,那边提供了我一个暂时盘,用于存储丢失的数据,最后就是我的所有数据都找回来了,但是,wordpress的数据库文件如果不备份的话,那你直面的就不是sql文件,而是.frm与.ibd文件,

如果你不懂数据表创建的话,那你先看文章,如果看不懂或者一懂半懂就请自己去学习数据库的相关知识!

这里顺便介绍一下.frm文件与.ibd文件与.ibdata文件

.frm:与表相关的元数据信息都存放在.frm文件中,主要是表结构的定义信息,不论什么存储引擎,每一个表都会有一个以表名命名的.frm文件。
.ibd和.ibdata:两者都是专属于InnoDB存储引擎的数据库文件。

当采用共享表空间时所有InnoDB表的数据均存放在.ibdata中,所以当表越来越多时,这个文件会变得很大;
相对应的.ibd就是采用独享表空间时InnoDB表的数据文件。
修改为独享表空间的方法是在my.ini配置文件中添加/修改此条:

Innodb_file_per_table=1

mysql存储的所有数据文件都在data,而我们只有.frm与.ibd

这些在数据库里面可以看见,但是打不开,打开直接报错,
那么废话不多说了,我们直接开始教程!
Mysql 5.6或者5.7,我这里用的是5.7,因为笔者专业是移动应用开发,所以学点Mysql不过分吧

我这边用的是自己电脑windows下 做的 因为它操作肯定要比服务器方便 当恢复回来后在导回服务器
我们先创建数据库建议数据库名跟生前的数据库名是一样的,比如我的焕奇博客生前数据库名为51huanqi.cn,那莫这个时候新建也是51huanqi.cn
1.先随意创建一张同名表
输入指令:

CREATETABLE wp_commentmeta(comment_IDbigint)ENGINE=InnoDB;

2.关闭mysql服务

net stop mysql

或者点击计算机--管理--服务--找到Mysql

然后关闭
3 复制备份的.frm覆盖新建的表.frm
4 开启mysql服务

net start mysql

5.在mysql安装目录data文件夹下用文本编辑器打开.err文件
找到错误日志

然后删除当前表

新建4个字段的同名表,这里建议大家用可视设计mysql的软件来设置,比如Navicat,这样的话就可以更方便,不会因为用指令创建数据表而出错

CREATE TABLEwp_commentmeta(
`meta_id` bigint(20)  NOT NULL ,
  `comment_id` bigint(20) NOT NULL ,
  `meta_key` varchar(255)  NULL,
  `meta_value` longtext NULL,
)
ENGINE=InnoDB;

新建拥有4个字段的表

最主要的是这种样式要跟生前一样meta_id bigint,里面的长度小数点主键外键都可以不管

然后再关闭mysql服务

net stop mysql

然后再复制备份的.frm覆盖新建的表.frm
修改配置文件my.ini在[mysqld]下添加/修改innodb_force_recovery=6,一般这一段是没有的,所以你用搜索功能搜索[mysqld],然后在下面添加innodb_force_recovery=6

启动mysql服务,查看表结构,这个时候你可以看见表结构已经恢复

mysql> desc wp_commentmeta;

导出表结构cmd

mysqldump -uroot -proot data_rec weibo_twets > e:\tweets.sql

后面是保存路径和保存名称以及后缀

在.sql文件中找到建表语句。
/*/或者也可以用数据库管理软件如navicat中找到这张表,在数据表右键对象信息中复制下DDL选项卡里的内容。

停止mysql服务,然后删除这张表,用获得的建表语句(/*/)新建这张数据表,也就是你刚刚复制的建表语句,加上ROW_FORMAT=COMPACT;将表结构改为静态表;

比如我复制的建表语句是

CREATE TABLE `wp_commentmeta` (
  `meta_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `comment_id` bigint(20) unsigned NOT NULL DEFAULT '0',
  `meta_key` varchar(255) COLLATE utf8mb4_unicode_520_ci DEFAULT NULL,
  `meta_value` longtext COLLATE utf8mb4_unicode_520_ci,
  PRIMARY KEY (`meta_id`),
  KEY `comment_id` (`comment_id`),
  KEY `meta_key` (`meta_key`(191))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;

那么添加ROW_FORMAT=COMPACT;后是这样的:

CREATE TABLE `wp_commentmeta` (
  `meta_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `comment_id` bigint(20) unsigned NOT NULL DEFAULT '0',
  `meta_key` varchar(255) COLLATE utf8mb4_unicode_520_ci DEFAULT NULL,
  `meta_value` longtext COLLATE utf8mb4_unicode_520_ci,
  PRIMARY KEY (`meta_id`),
  KEY `comment_id` (`comment_id`),
  KEY `meta_key` (`meta_key`(191))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci ROW_FORMAT=COMPACT;

然后在mysql使用命令提示符走这段建表语句就行了

注:一定要要有ROW_FORMAT=COMPACT;不然后面添加了.ibd文件依然打不开

好,我们有了表结构后,我们现在需要恢复表数据

分离表空间

使当前.ibd的数据文件和.frm分离。

ALTER TABLE wp_commentmeta DISCARD TABLESPACE;

然后复制备份的.ibd文件覆盖新的表数据

重启mysql

导入这个表空间

ALTER TABLE wp_commentmeta IMPORT TABLESPACE;

然后这里数据就恢复了!

注:本次教程是本地恢复,并不是线上恢复,线上恢复是一样的道理,也是一样的指令,可以试试

相关推荐