背景

在某个项目中,数据库是用docker起的一个MySQL容器。有天这个数据库容器所在的宿主机不可用了,容器起不起来了,因此尝试通过ibd和frm文件恢复存储的数据。

数据库版本:MySQL 5.7

相关知识

  • ibd文件:MySQL数据文件、索引文件,无法直接读取,用于存储与该表相关的数据、索引、表的内部数据字典信息。
  • frm文件:表结构文件,用来保存每个数据表的元数据(meta)信息,包括表结构的定义等,.frm文件跟数据库存储引擎无关,也就是任何存储引擎的数据表都必须有.frm文件,命名方式为数据表名.frm,如user.frm. .frm文件可以用来在数据库崩溃时恢复表结构。

过程

准备工作

找到所要恢复的数据库对应的ibd和frm文件,可以看docker起的mysql数据库是否有挂载数据目录,当时是直接执行以下命令来粗略查找的:

1
2
find -name mysql
find -name *.frm

在服务器中取得服务器所要恢复的数据库的frm和ibd文件,传输到本地windows环境中来。然后在windows环境中新建一个数据库,以下恢复过程在windows下进行。
在windows环境中找到mysql存放data的目录:通过my.ini文件,找到datadir对应的目录,在找到新建的数据库数据所在的文件夹。

恢复表结构

由于数据库是自己建的,在本地和服务器均有数据,但是本地的数据用于测试,不是完整的,但是表结构与服务器上的数据库表结构一致,因此可以根据本地的数据库,通过数据库连接工具导出表结构,重新在新的服务器环境上创建一个数据库。

恢复数据

  1. 根据表结构在新的数据库中创建一个同名的表,这里以t_user表为例进行说明。
  2. 在新数据库的sql命令执行器中执行以下命令,该命令删除了该数据库表对应的ibd文件,如t_user.ibd文件。

    1
    mysql> alter table t_user discard tablespace;
  3. 将旧的数据库的t_user表对应的ibd文件:t_user.ibd,拷贝到新的数据库中存放t_user表的目录下,该目录用于存放ibd及frm等文件。

  4. 在新的数据库的sql命令执行器中执行命令:

    1
    mysql> alter table t_user import tablespace;
  5. 执行查询语句,看一下是否恢复成功:SELECT * FROM t_user; 出现了查询结果,与原数据库t_user表中存储的内容一致,恢复成功!

  6. 按照以上步骤恢复其他表。

Tips

通过这样子的方法,也可以完成数据库迁移。

Read More

[1]详解MySQL中InnoDB的存储文件
[2]数据恢复新姿势——通过ibd和frm文件恢复数据