美文网首页工作学习记录
2019-07-08Mysql怎样实现仅从.frm文件和.ibd

2019-07-08Mysql怎样实现仅从.frm文件和.ibd

作者: 好久不见__dbd9 | 来源:发表于2019-07-08 11:00 被阅读0次

    一次恢复数据库表数据的任务,在此之前感谢指导我的各位前辈。

    1,刚拿到数据库文件,打开里面只有frm和ibd文件 。

    对于数据库了解不深,而像这种恢复数据的工作也没有做过,因此首先百度了一下.frm和.ibd文件是做什么的,见下:

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

    MySQL中.ibd文件:InnoDB引擎开启了独立表空间(my.ini中配置innodb_file_per_table = 1)产生的存放该表的数据和索引的文件。

    2,恢复表结构,在只有.frm文件发现创建的表不能打开,百度之后这道这样恢复是需要表结构的。在有了表结构的SQL语句之后创建表,发现清晰多了,完全就不需要frm文件了,但是ibd文件里的数据还是不能直接覆盖数据库里。在mysql5.5版本下数据库DATA目录并找不到ibd文件,这里不清楚是版本问题还是其他问题。

    3,数据库版本,在mysql5.5之下想找到ibd文件无果之后果断放弃,想使用mysql5.6来着,结果官网下载,莫名变成5.7.这里刘不管啦,反正都要试试。

    4,数据表数据,在mysql5.7 下重新建表

    这里用的Navicat工具,在表结构建好后,去MySQL

    的data目录下找到对应数据库,发现frm文件和ibd文件。Navicat中可以看到表,但是数据是没有的,这里将ibd文件覆盖之后发现数据表不能打开,会报[Err]

    1146 - Table 'users' doesn't exist,

    5,ibd文件覆盖,需要先放弃表空间,在创建表结构的时候,需要在sql语句后加上

    ROW_FORMAT=COMPACT;将表结构改为静态表;参考:https://www.chriscalender.com/tag/innodb-error-tablespace-id-in-file/

    然后在命令行放弃表空间;删除刚才新创建的ibd文件;

    ?

    1mysql> ALTERTABLE产品DISCARD TABLESPACE;

    之后将 ibd文件覆盖,重启MySQL服务,导入这个表空间;

    ?

    1mysql> ALTERTABLE产品IMPORT TABLESPACE;

    显示Query OK , 0 rows affected ,成功之后表数据就会在表中,在这中间可能会出现

    将MySQL服务强行关闭的情况,停掉mysql服务后,然后在配置文件my.ini中修改innodb_force_recovery = 1,再启动服务。

    进行上一步操作,等数据表数据完成后再删除掉。

    至此,使用.frm和.ibd文件恢复数据库数据的结束。

    注意:最好重新配置一个空的MySQL来进行恢复操作,这样不会影响到MySQL下别的数据库,本例中使用的是MySQL 5.6.39版。

    地址:

    https://www.2cto.com/database/201804/738585.html

    相关文章

      网友评论

        本文标题:2019-07-08Mysql怎样实现仅从.frm文件和.ibd

        本文链接:https://www.haomeiwen.com/subject/altohctx.html