丢失的 Frm 文件从 ibdata 恢复数据

丢失的 Frm 文件从 ibdata 恢复数据

我当时正在使用 mysql innodb 数据库。当我使用 mysqlworkbench 时,意外地从 mysql 数据文件夹中删除了所有 .frm 文件,但数据文件夹中仍有 ibdata 文件。我没有使用 innodb_file_per_table,这意味着我的所有 innodb 表数据都在单个 ibdata 文件中。

不幸的是,我没有备份可以恢复。有人能告诉我如何从 ibdata 文件恢复数据吗?

答案1

您的问题似乎与这个在 Stack Overflow 上。
我在这里重现了部分被接受的答案。


简单的解决方案是找到您保存的 SQL 副本CREATE TABLE ,在发展MySQL实例,然后将生成的FRM文件复制到恢复的实例中。

如果您无权访问这些CREATE TABLE语句,您可以尝试以下操作:

  1. 在恢复的数据库中,运行create table innodb_table_monitor (a int) ENGINE=InnoDB
  2. 观察 MySQL 服务器错误文件,直到表监视器数据被转储(通常大约一分钟)
  3. 跑步drop table innodb_table_monitor
  4. 停止还原的数据库

  5. 编写 SQL 来匹配表监视器的输出,例如:

    TABLE: name db/mylosttable, id 0 7872, flags 1, columns 5, indexes 1, appr.rows 1828
    COLUMNS: id: DATA_MYSQL DATA_NOT_NULL len 12; name: type 12 DATA_NOT_NULL len 45;     
    DB_ROW_ID: DATA_SYS prtype 256 len 6; DB_TRX_ID: DATA_SYS prtype 257 len 6; 
    DB_ROLL_PTR: DATA_SYS prtype 258 len 7;
    INDEX: name GEN_CLUST_INDEX, id 0 17508, fields 0/5, uniq 1, type 1
    root page 3, appr.key vals 1828, leaf pages 9, size pages 10
    FIELDS:  DB_ROW_ID DB_TRX_ID DB_ROLL_PTR id name
    

    可以表示为:

    drop table if exists mylosttable;
    create table mylosttable (
        id char(12) NOT NULL,
        name varchar(45) NOT NULL
    );
    

    如果您对表监视器输出感到困惑,请查看具有已知模式的表的输出。

  6. 发展MySQL 实例

  7. 将开发服务器中创建的 FRM 文件复制到恢复的数据库。您将在相应数据库的子目录中的 MySQL 数据目录中找到它们。

  8. 重新启动已恢复的数据库

    请注意,您可以将 FRM 文件从开发系统复制到实时数据库实例中。停止上述服务器的原因是,如果您在创建 innodb_table_monitor 表后使数据库崩溃,则会导致 ibdata 文件处于不一致状态,您必须从备份重新开始。

  9. 使用语句测试表格是否正常工作select *。如果你错了,你会看到:

    ERROR 2013 (HY000): Lost connection to MySQL server during query
    

这意味着数据库已崩溃。如果发生这种情况,请create table innodb_table_monitor...在开发实例上执行并将输出与恢复实例的原始输出进行比较。您可能会发现您错过了一个 NOT NULL 或类似的小东西。

相关内容