mysql根据.frm和.ibd文件恢复表结构和数据

以下内容未转载,因为我用的是wordpress,所有表结构都有,所以直接使用了黄底蓝字部分,成功恢复!原文作者少了必须的第4步,害我多花了很多时间-_-||。

这篇内容有些长,如果你急着恢复数据,直接略过前面关于数据库信息的一些解释。

在恢复数据之前,先来了解几个基本问题:

1、Mysql/Mariadb 的数据库引擎有好几个,常见或者常用的是:MYISAM和InnoDB,这个在新建数据库的时候就可以选择。

2、数据库如果出现 table doesn't exist in engine ,在重启Mysql服务后,提示:Unknown storage engine 'InnoDB',则需要启用 InnoDB :只需要在My.ini的数据库配置文件中启用下面代码即可:

innodb

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

table doesn

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,也就是强恢复 。

配置数据库 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。

navicat

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

 



[本日志由 admin 于 2022-01-04 00:53 AM 更新]
上一篇: 正则表达式之任意字符
下一篇: Mysql错误(Incorrect key file for table)try to repair
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: centos mysql
相关日志:
评论: 0 | 引用: 0 | 查看次数: 74
发表评论
昵 称:
密 码: 游客发言不需要密码.
邮 箱: 邮件地址支持Gravatar头像,邮箱地址不会公开.
网 址: 输入网址便于回访.
内 容:
验证码:
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.
字数限制 1000 字 | UBB代码 开启 | [img]标签 关闭

 广告位

↑返回顶部↑