从 frm 和 ibd 文件恢复表结构

新手上路,请多包涵

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

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

原文由 fraggley 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 822
2 个回答

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

获取 SQL 查询以创建表

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

  1. 首先,安装 MySQL 实用程序。然后您可以在命令提示符 (cmd) 中使用 mysqlfrm 命令。

  2. 其次,使用 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 文件导入数据并恢复数据。

原文由 Jin Lin 发布,翻译遵循 CC BY-SA 4.0 许可协议

多年后,我想加入讨论以分享我的解决方案,该解决方案是昨天遇到同样问题时成立的。

我搜索并尝试了很多不同的东西(比如使用 Mysql Utilities 脚本),重新创建表等等……但真正的解决方案更容易(也很棘手):

Step 1)

  • 备份旧数据文件夹(一般在 mysql/data 路径下)

Step 2)

  • 格式化或在其他地方安装一个新的和清晰的 mysql-server

Step 3)

  • 从备份(步骤 1)导入包含 mysql/data 中的 frm/idb 文件 的文件夹

注意:只有文件夹而不是所有文件

Step 4)

  • 从备份(步骤 1)导入名为 ibdata1 的文件并在全新的 mysql 安装中覆盖它

Step 5)

  • 重新启动 mysql 服务器(这可能会在启动前询问几秒钟,请稍等)

就这样!几秒钟后,Mysql 服务器应该会正常启动,如果没有任何损坏,文件应该被恢复!

小图更好地解释: 旧备份

解释:

- 蓝色: 要在新的 mysql-server 中导入的文件(第 3 步)

- 红色: 导入新 mysql-server 的文件

- 绿色: 要在新的 mysql-server 中导入的 ibdata1 文件(第 4 步)

原文由 Zenek 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏