mysql数据库通过frm、ibd文件恢复数据表和数据过程

阅读9评论0

在这之前记录过《记录mysql ibd文件误删,服务启动不了的恢复解决过程》,今天这个和之前的有异曲同工之妙。

背景:

客户的系统是三方制作的,三方公司倒闭没人维护了,还是找到的原三方公司的技术,给人家出的费用做的升级。但客户的服务器上有多个系统,共用一个mysql

那个技术在对他公司产品进行升级的时候,对数据库也升级了,可笑的是,他只把他们系统的数据库迁移走了,其他数据库没管……

客户也不清楚,还是在另外一个系统启用的时候发现启动不了,让帮忙看下,发现是少数据库了。
在服务器里面翻翻找找,还好有一个备份文件,只不过是data的库文件,不是sql……

过程:

1、恢复表

找到文件了,恢复呗。

通过frm恢复出来表结构,在同版本的mysql中创建相同的数据库,把恢复出来的表都创建一下。

mysqlfrm --diagnostic /data/pr_car.frm

(具体执行过程就不多说了,不会的可以网上搜索下,一大把教程)

2、恢复数据

这里要注意了,数据表字段的结构类型必须一致。我就是当时没注意,恢复的表字段有varchar(8692)执行不了,就改成text了,结果怎么都恢复不了数据,

在重置表空间的时候报错:

#1808 - Schema mismatch (Table has ROW_TYPE_DYNAMIC row format, .ibd file has ROW_TYPE_COMPACT row format.)

这点注意下就行,接着来。

然后,关闭数据库!关闭数据库!!关闭数据库!!!非常重要,要不然简单的事情就搞复杂了。

把备份的ibd文件复制到新建的数据库文件夹中(就是数据库data目录下),替换原来的ibd文件即可。

再启动数据库,查看数据表正常不(一般没问题,每一步都验证下最好)

这个时候如果select表的话,会报:

#1812 - Tablespace is missing for table `pr_rent`.`pr_car`.

mysql还没办法识别复制过来的ibd文件,需要重新绑定下表空间。

-- 丢弃表空间
ALTER TABLE pr_car DISCARD TABLESPACE;

-- 导入表空间
ALTER TABLE pr_car IMPORT TABLESPACE;

每个表都要执行下。
完事后,再select就OK了。

3、导出备份

这一步是我需要做的,其实到上一步就OK了。

因为客户mysql升级了,我需要把这个数据库导入到新的mysql中。

我是本地恢复的数据,所以需要导出sql,然后在客户服务器跑一遍就完事了。

0 位网友评论:

欢迎来评论

请填写验证码