Mysql InnoDB table doesn't exist in engine ibdata1损坏丢失恢复数据终极解决办法

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

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

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复制到上面新建的数据库文件下。

5、启动Mysql服务,执行 alter table songlyric import tablespace; 绑定 .frm 和 .ibd的关系。

数据恢复完成

6、大功告成,ibdata1损坏或丢失造成的数据问题恢复完成。

参考资料:

1、数据库Table doesn't exist in engine

2、完美解决mysql启动后随即关闭的问题(ibdata1文件损坏导致)

3、未删除的表结构从ibdata1文件进行恢复

4、MySQL 数据恢复案例

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

6、mysql innodb文件ibdata1损坏导致mysql无法启动

7、Troubleshooting InnoDB Data Dictionary Operations

8、MySQL Innodb数据库误删ibdata1后MySQL数据库的恢复案例

返回列表
上一篇: