从ibd文件中没有ibdata1的数据文件夹中恢复MySQL数据库


15

我的WAMP目录意外地被另一个用户删除。MySQL中仅数据文件夹可用。并且,因为只有数据库文件夹(带有数据库名称的“ \ bin \ mysql \ mysql5.6.12 \ data \”中的文件夹)可用。“ \ bin \ mysql \ mysql5.6.12 \ data \”的根目录中包括“ ibdata1 ”的所有文件也将被删除。

数据库文件夹仅包含具有以下扩展名的文件。

* .frm,*。ibd

和“ db.opt”文件。

如何恢复数据库?

我已经尝试恢复bdata1。但是,无法取回它。并且,某些数据库也包含MYISAM。

Answers:


16

我的ISAM

对于MyISAM表mydb.mytable,您应该具有三个文件

  • \bin\mysql\mysql5.6.12\data\mydb\mytable.frm
  • \bin\mysql\mysql5.6.12\data\mydb\mytable.MYD
  • \bin\mysql\mysql5.6.12\data\mydb\mytable.MYI

由于每个文件都包含所需的数据,元数据和索引信息,因此它们应该已经可以作为表访问。它们共同构成表格。没有可访问的外部存储引擎机制。

创新数据库

看看这个InnoDB的图形表示

InnoDB架构

将ibdata1附加到.ibd文件的唯一内容是数据字典。

您的任务(如果您决定接受它)是创建每个表并在 .ibd

在执行任何操作之前,请将“ \ bin \ mysql \ mysql5.6.12 \ data”的完整副本复制到另一个

这是一个样本

假设您有一个mydb带有表的数据库mytable。这表示

  • 你有文件夹 \bin\mysql\mysql5.6.12\data\mydb
  • 在该文件夹中,您有
    • mytable.frm
    • mytable.ibd

您需要.frm。如果您看一下我的文章,如何仅从.frm文件提取表架构?,您可以下载一个MySQL实用程序,该实用程序可以生成创建表所需的SQL。

您现在应该执行以下操作

  • 移动mytable.ibd\bin\mysql\mysql5.6.12\data
  • 运行SQL创建InnoDB表
  • 登录到mysql并运行ALTER TABLE mydb.mytable DISCARD TABLESPACE;(这将删除\bin\mysql\mysql5.6.12\data\mydb\mytable.ibd
  • 复制\bin\mysql\mysql5.6.12\data\mytable.ibd\bin\mysql\mysql5.6.12\data\mydb
  • 登录到mysql并运行ALTER TABLE mydb.mytable IMPORT TABLESPACE;(这将注册\bin\mysql\mysql5.6.12\data\mydb\mytable.ibd到数据字典中)

此后,该表mydb.mytable应该可以完全访问。您只需运行以下命令即可测试该可访问性:

SELECT * FROM mydb.mytable LIMIT 10;

试试看 !!!

负责任的DRINK(数据恢复结合了必要的知识)


为了完成这个好答案,对于innodb,您需要在删除表空间之前删除所有引用该表的FK约束。导入后,您应该重新创建FK。
SebaGra

在表空间导入之后,information_schema.key_column_usage(可能还有其他表)在第一个表上将不返回任何数据,select因此您必须执行至少一个查询并等待几秒钟,然后下一个查询才能工作。(适用于使用EditLine包装程序的linux-glibc2.12(x86_64)的mysql Ver 14.14 Distrib 5.7.19)
user3338098
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.