mysql根据.frm和.ibd文件恢复表结构和数据
作者:admin 日期:2022-01-03
以下内容未转载,因为我用的是wordpress,所有表结构都有,所以直接使用了黄底蓝字部分,成功恢复!原文作者少了必须的第4步,害我多花了很多时间-_-||。
这篇内容有些长,如果你急着恢复数据,直接略过前面关于数据库信息的一些解释。
在恢复数据之前,先来了解几个基本问题:
1、Mysql/Mariadb 的数据库引擎有好几个,常见或者常用的是:MYISAM和InnoDB,这个在新建数据库的时候就可以选择。
2、数据库如果出现 table doesn't exist in engine ,在重启Mysql服务后,提示:Unknown storage engine 'InnoDB',则需要启用 InnoDB :只需要在My.ini的数据库配置文件中启用下面代码即可:
3,MYISAM生成的数据库文件有三个:*.frm、*.MYD、*.MYI,如果不使用.sql备份数据库,一般情况下复制这三个文件,在数据库版本一样的情况下,可以完成数据库的备份。
4、InnoDB在生成的数据文件只有两个:*.frm,*.ibd,如果要备份数据,只复制这两个文件是不行的,需要连 ibdata1文件一起复制,一般情况不建议这么备份数据,因为ibdata1太容易出问题了。
ibdata1就是在InnoDB下存表信息的,也就是多表共享空间,在Mysql5.6.6默认情况下,是开启独表空间的,也就是开启了:innodb_file_per_table=1,这种情况下,如果 idbdata1丢失,或者损失,也是可以找回数据的。
数据库出现表打不开的情况,提示:table doesn't exist in engine
1、检查表是否存在数据库中,Show tables,如果能返回下面信息,说明表是在的:
2、停止(net stop mysql)数据库服务,删除Mysql数据库下的 ib_logfile0 和 ib_logfile1 文件,再重启数据库(net start mysql)。
如果以上操作,都没有恢复数据库正常,那基本上可以断定是 ibdata1 文件出问题。
恢复数据
在 ibdata1 损坏或者丢失的情况下,数据恢复分两种情况:
1、有表结构,2、没有表结构。
没有表结构的情况最麻烦,需要先恢复表结构:
1、新建一个数据库,随便什么数据库都行。
2、在此数据库中建立一张要恢复的数据表,表名要和 .frm和.ibd相同,比如我这里的:bb_user,这里先随便写个什么字段,此时数据库中会有两个文件:bb_user.frm和bb_user.ibd。
3、停止Mysql数据库服务,这里一定要停止,再把原来要恢复的 bb_user.frm覆盖到刚才新建表的文件中,这里需要手动操作覆盖文件。
4、在My.ini文件中配置:innodb_force_recovery = 6,也就是强恢复 。
5、启动Mysql数据库服务,使用 desc bb_user 查看表情况,这时会提示表不存在,去看Mysql错误日志,会看到提示:[Warning] InnoDB: Table wangyi/songlyric contains 1 user defined columns in InnoDB, but 7 columns in MySQL.
意思是这个表需要7个字段,我只创建了1个,这时不要慌,使用 Drop table bb_user,删除这个表。
6、或者上一步不删除表也行,把My.ini中刚才加的强恢复语句先注释掉,重启服务,再增加6个字段,随便什么字段都可以。
7、重建表后,或者添加字段后,按前面第4步开始的,操作,最后使用 desc bb_user 查看,就能看到出来下面信息了:
8、出现以上信息,说明表结构恢复正常了,接下来,我们就需要用这个表结构信息重新建完整表结构的数据表了。
9、使用Navicat可以很方便得复制到这个表结构,删除表,注释 innodb_force_recovery = 6。
10、使用上面复制到的建表语句,在最后一句的 CHARSET=utf8 后面加上 ROW_FORMAT=COMPACT ,表示恢复表数据。
这个时候可能还会出现一个情况:Foreign key constraint is incorrectly formed ,表外键出错,可能在这个表结构语句中,出现外键的表不存在数据库,那就先换一个数据表恢复。
以上就是恢复表结构的过程。
如果你知道表结构,就可以直接用下面的办法恢复数据:
1、使用上面第10步讲到的,直接在表结构的建表语句中添加 :ROW_FORMAT=COMPACT,新建表。
2、执行 alter table songlyric discard tablespace; 解除表数据和表结构绑定,执行完后,.ibd文件会删除。
3、停止Mysql服务,将要恢复的表数据文件 bb_user.ibd复制到上面新建的数据库文件下。
4、chown -R mysql:mysql *.ibd
5、启动Mysql服务,执行 alter table songlyric import tablespace; 绑定 .frm 和 .ibd的关系。
6、大功告成,ibdata1损坏或丢失造成的数据问题恢复完成。
原文链接:https://www.linyufan.com/content-10-1742-1.html
下一篇: Mysql错误(Incorrect key file for table)try to repair
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: centos mysql
相关日志:
广告位