从frm和ibd文件恢复表结构

问题描述 投票:4回答:5

我试图恢复PMA中的数据库,但只能访问frm和ibd文件 - 而不是我理解你需要的ib_log文件。

我知道我可能无法恢复数据库数据但是是否可以从frm文件中恢复表的结构?

mysql sql phpmyadmin innodb
5个回答
21
投票

我只从.frm.idb文件恢复了表。

Get the SQL query to create the tables

如果您已经知道表的架构,则可以跳过此步骤。

  1. 首先,安装MySQL Utilities。然后,您可以在命令提示符(cmd)中使用mysqlfrm命令。
  2. 其次,使用.frm命令从mysqlfrm文件获取SQL查询: mysqlfrm --diagnostic <path>/example_table.frm

然后,您可以获取SQL查询以创建相同的结构化表。像这样:

CREATE TABLE `example_table` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(150) NOT NULL,
  `photo_url` varchar(150) NOT NULL,
  `password` varchar(600) NOT NULL,
  `active` smallint(6) NOT NULL,
  `plan` int(11) NOT NULL,
PRIMARY KEY `PRIMARY` (`id`)
) ENGINE=InnoDB;

Create the tables

使用上面的SQL查询创建表。

如果旧数据仍然存在,则可能必须先删除相应的数据库和表。确保备份数据文件。

Restore the data

运行此查询以删除新表数据:

ALTER TABLE example_table DISCARD TABLESPACE;

这将删除新的.frm文件和(新的,空的).idb文件之间的连接。另外,删除文件夹中的.idb文件。

然后,将旧的.idb文件放入新文件夹,例如:

cp backup/example_table.ibd <path>/example_table.idb

确保.ibd用户可以读取mysql文件,例如:通过在文件夹中运行chown -R mysql:mysql *.ibd

运行此查询以导入旧数据:

ALTER TABLE example_table IMPORT TABLESPACE;

这将从.idb文件导入数据并将还原数据。


4
投票

InnoDB需要ib_log文件进行数据恢复,但它还需要包含数据字典的ibdata1文件,有时还包含表的待处理数据。

数据字典是一种重复的系统,它记录表结构,并将表id与包含表数据的物理.ibd文件相匹配。

您不能只在没有InnoDB数据字典的情况下移动.ibd文件,并且数据字典必须与.ibd文件中找到的表ID匹配。您可以重新附加.ibd文件并恢复数据,但该过程不适合胆小的人。见http://www.chriscalender.com/recovering-an-innodb-table-from-only-an-ibd-file/

您可以使用带有一些文件技巧的.frm文件来恢复结构,但是您最初无法将它们创建为InnoDB表。这是一个博客,其中介绍了将.frm文件恢复为MyISAM表的方法:http://www.percona.com/blog/2008/12/17/recovering-create-table-statement-from-frm-file/

您将无法使用PMA。您需要超级用户访问服务器上的数据目录。


1
投票

您可以从.frm文件和ibd文件中的数据恢复表结构。

使用mysqlfrm工具,它是MySQL Utilities的一部分

shell> mysqlfrm --diagnostic myfile.frm

使用表结构在同名数据库中重新创建表。

mysql> CREATE mytable (int i);

丢弃新创建的表的表空间。

mysql> ALTER TABLE mytable DISCARD TABLESPACE;

将备份目录中的孤立.idb文件复制到新数据库目录。确保.ibd文件具有必要的文件权限。

导入孤立.ibd文件。将发出警告,指示InnoDB将尝试导入文件而不进行架构验证。

mysql> ALTER TABLE r IMPORT TABLESPACE;SHOW WARNINGS;


1
投票

只要您知道如何操作,这实际上非常简单,并且不需要外部软件或shell命令。

默认情况下,数据库数据存储在C:\ xampp \ mysql \ data \或类似数据库中。文件夹是数据库表。在每个文件夹中,.frm文件是列。 .ibd保存行值。

首先在PHPMyAdmin中创建数据库。

在菜单Recover structure> From .frm file下获取从此站点生成的SQL查询:

https://recovery.twindb.com/

上载每个.frm文件,然后将这些查询复制并粘贴到SQL命令中,以在PHPMyAdmin中创建表。

然后,在每个表上,执行以下SQL查询:

ALTER TABLE table_name DISCARD TABLESPACE

这将自动从数据库目录中删除新的.ibd文件。将旧的.ibd文件复制到数据库文件夹中。运行以下命令以再次激活该表:

ALTER TABLE table_name IMPORT TABLESPACE

就是这样!您应该能够再次查看和访问所有旧值。


0
投票

您也可以尝试使用mysql实用程序。

从book.frm文件到文件book.sql:

mysqlfrm --server=root:mysqladmin@localhost:3306 D:\yahwehdb\yahweh_altera\book.frm > D:\yahwehdb\yahweh_altera\book.frm\book.sql --diagnostic --port=3307 --user=root

从包含所有.frm文件的目录到文件all.sql:

mysqlfrm --server=root:mysqladmin@localhost:3306 D:\yahwehdb\yahweh_altera > D:\yahwehdb\yahweh_altera\all.sql --diagnostic --port=3307 --user=root
© www.soinside.com 2019 - 2024. All rights reserved.