mysql由.frm和.ibd恢复数据

版权声明:作者:傲娇天子 博文主页地址:https://blog.csdn.net/qq_41116956 欢迎转载,转载请在文章页面明显位置给出原文链接,谢谢 https://blog.csdn.net/qq_41116956/article/details/82996319
数据小常识:
.frm存放数据库的表结构
.ibd存放数据内容

注意:文章内容后附带部分跳坑技巧+本文的原件(主要给小博主本人使用O(∩_∩)O哈哈~)


数据恢复:

1:创建数据库

2:创建需要恢复的表

这样就会在对应的数据库下产生.frm和.ibd文件

跳坑:创建表时候的字段和需要被恢复的表的一致

3:执行

ALTER TABLE 表名字 DISCARD TABLESPACE;

比如:

ALTER TABLE user DISCARD TABLESPACE;

当表名字和mysql中的关键词一样是的时候需要加上 `` 号

ALTER TABLE `user` DISCARD TABLESPACE;   

ALTER TABLE `comment` DISCARD TABLESPACE;  

这时候数据库文件下面的 user.ibd 文件就会消失

4:将备份的ibd放到消失的user.ibd文件下

5:修改权限,所有者mysql,权限660

6:执行

ALTER TABLE 表名字 IMPORT TABLESPACE;

好了,现在试一下数据可以使用了不,成功了就不需要看后面的内容了!


跳坑技巧:

1.因为.frm就是表结构,所以大家会直接使用表结构

错误:创建的表结构和本身的.frm表结构虽然一样(小博主验证过),但是在使用命令是会提示表不存在

例如:

建立数据库:直接把.rfm和.ibd文件拷在数据库下——————————会报错,小博主不知道原因

本文使用:先建立和之前user表一样的表结构。就是执行create table user .... ,执行完,数据库目录下就会建立user.ibd文件(当然还有其他的)——————————————执行成功

2:不知道表结构可以使用mysqlfrm软件将.frm的表结构导入成表结构SQL语句(有linux版和windows版)

需要的就去和百度大佬商量吧

3:导入表数据也就是第六步的时候错误:

(Table has ROW_TYPE_COMPACT row format, .ibd file has ROW_TYPE_DYNAMIC row format.

这里说的是... ROW_TYPE_COMPACT ... ,... ROW_TYPR_DYNAMIC

(这张表是mysql5.7版本,.ibd文件是5.6版本,所以错误)

所以小博主选择的是安装mysql5.7版本

如果是:ROW_TYPE_DYNAMIC 到 ROW_TYPE_COMPACT,解决方案见下:

(这张表示mysql5.6版本,.ibd文件是5.7版本,所以错误)

mysql知识点:

mysql5.7.*版本innodb_file_format参数(表示innodb文件格式)的默认值发生了变化:

在5.7.*版本中innodb_file_format默认是Antelope,而默认的行格式(ROW_FORMAT)是COMPACT

在5.6.*版本中innodb_file_format默认是Barracuda,而默认的行格式(ROW_FORMAT)是DYNAMIC

所以需要在创建表结构时加上row_format=compact

下面是报错信息:

ERROR 1808 (HY000): Schema mismatch (Table flags don't match, server table has 0x5 and the meta-data file has 0x1)

和

ERROR 1808 (HY000): Schema mismatch (Table has ROW_TYPE_DYNAMIC row format, .ibd file has ROW_TYPE_COMPACT row format.)

本文原件:

1、建立数据库:直接把.rfm和.ibd文件拷在数据库下;(已经证明可能报错,但是思路是如此)
2、进入数据库:执行 alter table 表名称 discard tablespace ; 执行完之后,数据库目录下的user.ibd文件就没了
3、把你备份的ibd放到消失的user.ibd文件那里。
4、给这个文件加权限,所有者mysql ,权限660(你可以参考别的ibd文件所有者和权限设置)
5、执行 alter table 表名称  import tablespace; 执行完,表数据就可读了,这时候会丢失一些诸如表行记录数等存在系统表里的信息,不过那些信息无所谓。表其实这时候已经可以正常用了。如果不放心,可以导出sql语句或txt,再创建表导入。
还是不行的话:
1、先建立和之前user表一样的表结构。就是执行create table user .... ,执行完,数据库目录下就会建立user.ibd文件(当然还有其他的)
2、执行 alter table `user` discard tablespace ; 执行完之后,数据库目录下的user.ibd文件就没了
3、把你备份的ibd放到消失的user.ibd文件那里。
4、给这个文件加权限,所有者mysql ,权限660(你可以参考别的ibd文件所有者和权限设置)
5、执行 alter table `user` import tablespace; 执行完,表数据就可读了,这时候会丢失一些诸如表行记录数等存在系统表里的信息,不过那些信息无所谓。表其实这时候已经可以正常用了。如果不放心,可以导出sql语句或txt,再创建表导入。

END,完~

猜你喜欢

转载自blog.csdn.net/qq_41116956/article/details/82996319