MySQL通过.frm和.ibd文件恢复数据

关于.frm文件:

.frm文件:保存了每个表的元数据,包括表结构和定义等,该文件与数据库引擎无关。

关于.ibd文件:

.ibd文件:InnoDB引擎用于存放表数据和索引的文件。

恢复步骤

1. 生成创建SQL语句

可以从frm文件中获取你的创建SQL语句。你必须使用:https://dev.mysql.com/doc/mysql-utilities/1.5/en/mysqlfrm.html

 mysqlfrm --server=root:pass@localhost:3306 c:\MY\t1.frm --port=3310

也可以通过其他方式获得创建SQL语句。

2. 在数据库中创建你的表

3. 修改表xxx,丢弃表空间

如果你想替换你的*.ibd文件,需要丢弃对应的表空间。

4. 将你的*.ibd文件(MySQL或MariaDB)复制到MariaDB的数据路径

首先,我尝试使用MySQL 5.5和5.6进行恢复,但是数据库崩溃并立即停止,因为表空间ID损坏错误。(ERROR 1030 (HY000): Got error -1 from storage engine),之后,我使用了MariaDB 10.1.8,成功恢复了数据。

5. 修改表xxx,导入表空间

执行该步骤可能会报错: ERROR 1808 (HY000): Schema mismatch (Table has ROW_TYPE_DYNAMIC row format, .ibd file has ROW_TYPE_COMPACT row format.)

修复报错: Manually adding ROW_FORMAT=compact at the end of the CREATE statement did the trick. or

ALTER TABLE tablename ROW_FORMAT=COMPACT;

当您运行此语句时,MariaDB会警告文件,但它的警告并不比恢复您的数据更重要。数据库仍将继续运行,您可以查看您的数据。

缺少.frm文件也可以恢复, 前提是需要知道表结构, 手动建表

本文总阅读量