从frm和ibd文件恢复表结构
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从frm和ibd文件恢复表结构相关的知识,希望对你有一定的参考价值。
我试图恢复PMA中的数据库,但只能访问frm和ibd文件 - 而不是我理解你需要的ib_log文件。
我知道我可能无法恢复数据库数据但是是否可以从frm文件中恢复表的结构?
我只从.frm
和.idb
文件恢复了表。
Get the SQL query to create the tables
如果您已经知道表的架构,则可以跳过此步骤。
- 首先,安装MySQL Utilities。然后,您可以在命令提示符(cmd)中使用
mysqlfrm
命令。 - 其次,使用
.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
文件导入数据并将还原数据。
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。您需要超级用户访问服务器上的数据目录。
您可以从.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;
只要您知道如何操作,这实际上非常简单,并且不需要外部软件或shell命令。
默认情况下,数据库数据存储在C: xampp mysql data 或类似数据库中。文件夹是数据库表。在每个文件夹中,.frm文件是列。 .ibd保存行值。
首先在phpMyAdmin中创建数据库。
在菜单Recover structure> From .frm file下获取从此站点生成的SQL查询:
上载每个.frm文件,然后将这些查询复制并粘贴到SQL命令中,以在PHPMyAdmin中创建表。
然后,在每个表上,执行以下SQL查询:
ALTER TABLE table_name DISCARD TABLESPACE
这将自动从数据库目录中删除新的.ibd文件。将旧的.ibd文件复制到数据库文件夹中。运行以下命令以再次激活该表:
ALTER TABLE table_name IMPORT TABLESPACE
就是这样!您应该能够再次查看和访问所有旧值。
您也可以尝试使用mysql实用程序。
从book.frm文件到文件book.sql:
mysqlfrm --server=root:mysqladmin@localhost:3306 D:yahwehdbyahweh_alteraook.frm > D:yahwehdbyahweh_alteraook.frmook.sql --diagnostic --port=3307 --user=root
从包含所有.frm文件的目录到文件all.sql:
mysqlfrm --server=root:mysqladmin@localhost:3306 D:yahwehdbyahweh_altera > D:yahwehdbyahweh_alteraall.sql --diagnostic --port=3307 --user=root
以上是关于从frm和ibd文件恢复表结构的主要内容,如果未能解决你的问题,请参考以下文章