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文件也可以恢复, 前提是需要知道表结构, 手动建表