不小心给k8s集群卸载了,但是数据库的目录还在,本以为给数据目录拷贝到新的MySQL数据目录下,数据就会正常恢复,但是并没有那么简单。。。。 查阅了各种博客,终于发现了问题,接下来就讲一下如何用数据目录中的元数据恢复数据库。

1、数据目录文件解释

        MySQL默认的存储引擎从版本5.5.5开始就是InnoDB了,当你创建表时,如果没有明确指定存储引擎,MySQL就会使用默认的存储引擎InnoDB来创建表。这意味着表在文件系统中会有对应的.ibd和.frm文件。.ibd文件存储表的数据和索引,而.frm文件包含表的结构定义

        这些文件本身不能直接打开。因为InnoDB存储引擎的表数据与结构是密切相关的,所以在恢复数据之前,需要先恢复表的结构。就算有建表语句,但直接跳到.ibd文件恢复表数据也是不可行的,因为.ibd文件中存储的数据需要与正确的表结构相匹配才能被恢复。

        所以其正确的恢复步骤是启动MySQL,解析.frm生成表结构的语句,建表,然后丢弃这个表的表数据文件就是.ibd文件,停止MySQL服务,将原ibd文件拷贝到这个数据库的数据目录下,并赋予777权限,然后启动MySQL,绑定这个新的ibd文件文件即可。(解析.frm工具可以用dbseeker_frm。工具链接:https://pan.baidu.com/s/1KUPye337BGHgVHE6s_X-mw
提取码:Andy)

2、具体操作

1、启动新的MySQL,通过dbseeker解析表结构,建表。

点击这个,进去程序,选择.frm文件即可

2、建表完成之后,丢弃表数据文件.ibd,执行以下语句

-- your_table_name 你对应的表名
ALTER TABLE your_table_name DISCARD TABLESPACE;

3、停止MySQL,将要恢复的.ibd文件传入对应的目录,并且赋予 777 权限,注意表名是一样的。

4、启动MySQL,绑定恢复的.ibd数据文件。需执行以下语句

-- your_table_name 你对应的表名
ALTER TABLE your_table_name IMPORT TABLESPACE;

刷新表会发现数据恢复了!!!

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐