【问题标题】:Restore table structure from frm and ibd files从 frm 和 ibd 文件恢复表结构
【发布时间】:2021-09-03 09:46:04
【问题描述】:

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

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

【问题讨论】:

    标签: mysql sql phpmyadmin innodb


    【解决方案1】:

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

    获取 SQL 查询以创建表

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

    1. 首先,安装MySQL Utilities。 然后你可以在命令提示符(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 文件中导入数据并将恢复数据。

    【讨论】:

    • 我试过这个,但是当我运行 import query "#1812 - Tablespace is missing for table wallipop.categories."时出现以下错误。
    • 我通过更改文件的所有权解决了这个问题,但现在我得到“#1808 - 架构不匹配(表具有 ROW_TYPE_DYNAMIC 行格式,.ibd 文件具有 ROW_TYPE_COMPACT 行格式)。”
    • 对于遇到 ROW_TYPE_DYNAMIC 问题的其他任何人,就像我刚刚做的那样。您必须从头开始该过程,并在您的创建表语句中添加 ROW_FORMAT=COMPACTENGINE=InnoDB 之后,例如,它看起来像 ) ENGINE=InnoDB ROW_FORMAT=COMPACT DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci。然后像往常一样重复这些步骤,它应该可以工作。
    • 嘿,请指导我如何在 Windows 上执行权限/所有权步骤?确保 .ibd 文件可以被 mysql 用户读取,例如通过在文件夹中运行 chown -R mysql:mysql *.ibd。
    • 如果您有大量 .frm 文件?
    【解决方案2】:

    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。您需要超级用户访问服务器上的数据目录。

    【讨论】:

    • 我想支持 Peter 从 .frm 文件中恢复结构的方法。只需确保 MySQL 版本低于 5.6。 5.6会报错fake table的列数比frm文件少。
    【解决方案3】:

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

    使用MySQL Utilities中的mysqlfrm工具

    shell&gt; mysqlfrm --diagnostic myfile.frm

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

    mysql&gt; CREATE mytable (int i);

    丢弃新建表的表空间。

    mysql&gt; ALTER TABLE mytable DISCARD TABLESPACE;

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

    导入孤立的 .ibd 文件。发出警告,指示 InnoDB 将尝试在没有模式验证的情况下导入文件。

    mysql&gt; ALTER TABLE r IMPORT TABLESPACE;SHOW WARNINGS;

    【讨论】:

      【解决方案4】:

      您也可以尝试使用 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
      

      【讨论】:

        【解决方案5】:

        这其实很简单,只要你知道怎么做,不需要外部软件或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
        

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

        【讨论】:

        • 网站打不开是什么原因?
        猜你喜欢
        • 1970-01-01
        相关资源
        最近更新 更多