版权声明:作者:傲娇天子 博文主页地址: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,完~