如何从 ibdata 和 .frm 文件中恢复 InnoDB MySQL 表数据

举报
Tiamo_T 发表于 2021/11/25 19:21:03 2021/11/25
【摘要】 本教程介绍了当所有或部分表丢失,或者当 MySQL 无法加载表数据时,如何恢复 MySQL 表。

本教程介绍了当所有或部分表丢失,或者当 MySQL 无法加载表数据时,如何恢复 MySQL 表。

发生这种情况的原因之一是表数据损坏时。

在这种特殊情况下,当您连接到 MySQL 数据库服务器时,您无法再看到一个表,因为它们丢失了。

在这种情况下,MySQL 日志文件包含以下消息:

InnoDB: Error: log file ./ib_logfile0 is of different size 0 50331648 bytes
InnoDB: than specified in the .cnf file 0 5242880 bytes!
[ERROR] Plugin 'InnoDB' init function returned error.
[ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
[ERROR] Unknown/unsupported storage engine: InnoDB
[ERROR] Aborting

下面解释的方法仅适用于 InnoDB 数据库。

注意:在您执行任何操作之前,请备份当前状态下的所有 MySQL 文件和数据库,并将其保存在安全的地方。

要恢复表数据,您必须确保数据目录及其内容完好无损。就我而言,这很好。

drwx------ 2 mysql mysql     4096 Oct 11  2012 performance_schema
drwx------ 2 mysql mysql     4096 Dec 10  2012 ndbinfo
drwx--x--x 2 mysql mysql     4096 Dec 10  2012 mysql
-rw-rw---- 1 mysql mysql       56 Dec 19  2012 auto.cnf
drwx------ 2 mysql mysql     4096 Jul 30  2013 bugs
-rw-r----- 1 mysql mysql 50331648 Mar 18 10:35 ib_logfile0
-rw-r----- 1 mysql mysql 50331648 Apr 22  2013 ib_logfile1
-rw-r----- 1 mysql mysql 35651584 Mar 18 10:35 ibdata1
  • Ibdata1——该文件是InnoDB系统表空间,包含多个InnoDB表和关联索引。
  • *.frm – 保存所有 MySQL 表的元数据信息。这些文件位于相应 MySQL 数据库的文件夹内。(例如,在“bugs”目录中)
  • ib_logfile* – 所有数据更改都写入这些日志文件。这类似于我们在其他 RDBMS 数据库中发现的归档日志概念。

复制文件

要从上述文件中恢复数据,首先要停止 MySQL 服务器。


# service mysqld stop

将 ibdata 文件和数据库架构文件夹复制到其他目录。我们将使用它来恢复我们的 Mysql 数据库。在这种情况下,我们将其复制到 /tmp 目录。本示例中的数据库方案名称为 bugs。

cp –r ibdata* ib_logfile* /tmp

cp –r schema_name/ /tmp/schema_name/

启动 MySQL 服务器:

# service mysqld start

在相关说明中,对于典型的 MySQL 数据库备份和恢复,您应该使用mysqldump 命令

恢复数据

接下来,按照下面的说明恢复表数据。

在 my.cnf 配置文件中,将以下参数的值设置为 ib_logfile0 文件的当前大小。在以下示例中,我将其设置为 48M,因为这是我执行“ls -lh ib_logfile0”时看到的 ib_logfile0 文件的大小

innodb_log_file_size=48M

请注意,ib_logfile0 和 ib_logfile1 文件大小将相同。

将之前的 ibdata 文件复制到 mysql 数据目录中的相应位置。

cp –r / tmp / ibdata * / var / lib / mysql /

在数据目录中创建一个与您尝试恢复的数据库架构名称同名的空文件夹,并将之前的 .frm 文件复制到该文件夹​​中,如下所示:

cp –r / tmp / ib_logfile * / var / lib / mysql /
cp –r /tmp/schema_name/*.frm /var/lib/mysql/schema_name/

最后,重启 MySQL 服务器。

service mysqld restart

现在,您的 MySQL 服务器运行在恢复的表中。不要忘记为客户端授予适当的权限以连接到 MySQL 数据库。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。