mysql数据库通过frm、ibd文件恢复数据表和数据过程
在这之前记录过《记录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 位网友评论: