从.ibd,.frm和mysqllogbin文件还原MySQL表


10

由于某种原因,当我尝试打开存储在其中的表.frm.ibd文件(无论是在MySQL还是phpmyadmin上)时,它给了我一个语法错误,或者说它不存在。

我读过另一篇与此有类似问题的文章,但是我不知道如何检查是否innodb_file_per_table已启用,并且总体上我真的很困惑。我还将mysql-bin.000002文件的副本转换为txt文件,因此我发现数据库中的数据并未完全丢失。

该数据库是去年创建的。我有6个mysql-bin.00000文件,但由于某种原因,.000002它是最大的。现在,我拥有所有数据库的.ibd.frm文件,但是对于如何将其还原回MySQL或至少还原为我可以读取的内容,我感到困惑。

我在Windows 2003 Server上使用WampServer 2.4和MySQL 5.6.12。另外,我应该在InnoDB中下载插件吗?


不,它是去年创建的。我有6个mysql-bin.00000文件,但是由于某种原因,.000002是最大的。现在,我的所有数据库都有.ibd和.frm文件,但是我对如何将其恢复到MySQL或至少可以读取的内容一无所知。
carment

Answers:


20

我终于通过反复尝试找出了解决问题的方法。对于那些没有原始ibdata1文件,而只有.frm和.ibd文件的用户,这是我恢复数据的方式。

  1. 在-> http://dev.mysql.com/downloads/utilities下载并安装MySQL实用程序。
  2. 进入命令/终端以打开MySQL实用工具mysqlfrm,并使用它来查找需要还原的表的结构。我是怎么做到的,我将其安装到mysqlfrm的文件位置,然后输入“ mysqlfrm --server = user:pwd @ localhost --port = 3307“ path_to_.frm_file”> table_name.txt“。如果您未指定要保存的.txt文件,则应与保存实用程序的文件夹保存在同一文件夹中。
  3. 在文本文件中,您将看到CREATE TABLE语句,其中包含表的所有列和信息(基本上是原始结构)。复制带有所有信息的CREATE语句。
  4. 在您的MySQL命令中,创建一个新数据库(CREATE DATABASE database_name)。使它与原始数据库名称相同。
  5. 在新数据库中创建一个新表-不必与该文件夹同名。您可以在命令提示符下创建新表,但是我在PhpMyAdmin中创建了表,PhpMyAdmin是一个免费软件工具,用于处理Web上的MySQL管理。我只需单击PhpMyAdmin上的数据库,然后单击SQL表,然后粘贴#3中的表结构。(作为附带说明,如果我在命令提示符下将表命名为“ table”,则总是会收到错误消息,因此请避免使用该名称)。
  6. 在MySQL命令上,进入数据库,然后输入“ ALTER TABLE table_name DISCARD TABLESPACE”,这实际上将删除该表的.ibd文件。
  7. 将原始表(要还原的表)的.ibd文件复制到新创建的表中,以替换刚刚删除的.ibd文件。将您的初始.ibd文件更改为新创建的表的名称。这将模仿您刚刚删除的旧.ibd文件。您可以在计算机上新创建的数据库文件夹下的MySQL数据文件夹中找到此文件夹。
  8. 返回到MySQL命令,进入数据库,然后输入“ ALTER TABLE table_Name IMPORT TABLESPACE”。您会收到一条“警告”(1)错误类型的语句,但是请忽略该语句。
  9. 并做了!如果您尝试访问新表,则该表应包含旧表中的所有数据。

希望对您有所帮助,如果您有任何疑问或意见,请告诉我!另外,请查看http://www.chriscalender.com/?tag=innodb-error-tablespace-id-in-file有关其他详细信息。


很好的说明,但仅适用于MySQL 5.6!在5.5上Got error -1 from storage engine,运行时会出现错误IMPORT TABLESPACE。但是对我来说,MySQL 5.6适用于使用MySQL 5.5创建的表,所以一切都很好;)。如果您坚持使用5.5,则必须遵循所摆出的chriscalender链接中的说明。
ostrokach,2015年

@carment我按照您的指示进行操作,但是我遇到了ERRPR:试图访问空间13635中的页码1767006713,空间名称<dbname> / <tblname>,该空间在表空间范围之外。你能指导我做什么?
Mohit Mehta '02

这只是节省了我大量时间来重新创建表。该方法在2016年仍适用于MySQL 5.7.17
Andy Mercer

@ostrokach似乎是因为您尚未innodb_file_per_table启用。
伊凡(Yvan)

您只是..经过一段漫长的旅程才救了我,谢谢!
Amr SubZero

4

主要的InnoDB数据文件(通常是命名文件)ibdata对于MySQL理解您的.ibd文件至关重要。

如果需要使用二进制文件在服务器之间移动数据,则应彻底停止MySQL,然后在目录之间移动所有数据文件,包括ibdata文件

在Windows上的服务器之间移动数据的一种更可靠的机制是使用(mysqldump)或从PHPMyAdmin(或类似工具)导出数据库。

如果在整个服务器运行期间都启用了二进制日志记录(基于注释,可能并非如此),则还可以mysqlbinlog用来从mysql-bin文件中恢复服务器上运行的所有SQL语句。 ,然后以这种方式重新创建数据库。mysql-bin文件中应该有unix时间戳,可以帮助您确定它们的返回时间。

如果丢失了原始数据库文件,而剩下的只是单个.ibd文件,则可能必须根据akuzminsky在注释中的建议来恢复数据。

MySQL 5.6具有一些用于移动InnoDB .ibd数据文件(可移动表空间)的新功能,但是这些功能需要一些工作,并且对于足够小的数据库,使用来传输数据将变得更加容易mysqldump


0

Wiki答案来自akuzminsky的问题评论


如果看到*.ibd文件,innodb_file_per_table则为ON,否则所有表都位于ibdata1

如果它告诉一个表不存在,那么该表在InnoDB词典中丢失。尝试将所有表转储到单独的sql转储(一个表-一个文件)。那些无法转储的表可以使用TwinDB恢复工具包进行恢复

还没有二进制包。您必须从GitHub获取源代码并进行编译。请参阅“ 恢复InnoDB词典”中的说明。这很简单:

git clone git@github.com:twindb/undrop-for-innodb.git

然后

make all
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.