【发布时间】:2021-09-03 09:46:04
【问题描述】:
我正在尝试在 PMA 中恢复数据库,但只能访问 frm 和 ibd 文件,而不是我理解您需要的 ib_log 文件。
我知道我可能无法恢复数据库数据,但是否可以从 frm 文件中恢复表的结构?
【问题讨论】:
标签: mysql sql phpmyadmin innodb
我正在尝试在 PMA 中恢复数据库,但只能访问 frm 和 ibd 文件,而不是我理解您需要的 ib_log 文件。
我知道我可能无法恢复数据库数据,但是否可以从 frm 文件中恢复表的结构?
【问题讨论】:
标签: mysql sql phpmyadmin innodb
我仅从 .frm 和 .idb 文件恢复了表。
如果您已经知道表的架构,则可以跳过此步骤。
首先,安装MySQL Utilities。
然后你可以在命令提示符(cmd)中使用mysqlfrm命令。
其次,使用mysqlfrm命令从.frm文件中获取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;
使用上述 SQL 查询创建表。
如果旧数据仍然存在,您可能必须先删除相应的数据库和表。确保您有数据文件的备份。
运行此查询以删除新表数据:
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 文件中导入数据并将恢复数据。
【讨论】:
wallipop.categories."时出现以下错误。
ROW_FORMAT=COMPACT 在 ENGINE=InnoDB 之后,例如,它看起来像 ) ENGINE=InnoDB ROW_FORMAT=COMPACT DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci。然后像往常一样重复这些步骤,它应该可以工作。
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 文件中恢复数据。
使用MySQL Utilities中的mysqlfrm工具
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;
【讨论】:
您也可以尝试使用 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
【讨论】:
这其实很简单,只要你知道怎么做,不需要外部软件或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
就是这样!您应该能够再次查看和访问所有旧值。
【讨论】: