【问题标题】:Recover MySQL InnoDB data/structure from .frm (no .myd and .myi, ibdada, my.ini) files从 .frm(无 .myd 和 .myi、ibdada、my.ini)文件中恢复 MySQL InnoDB 数据/结构
【发布时间】:2014-08-13 23:53:00
【问题描述】:

我试图从从 innodb 定义的表中复制的文件夹中恢复我的旧 innodb 数据库。目前没有二进制日志文件和 my.ini 文件。我手头没有 ibdata 日志文件。我只需要能够重新读取表格信息,以便我可以重新制作那些丢失的表格。

我也将失去外键关系。

我怎样才能恢复这些数据进入不可用日志文件的表的结构?

当我尝试访问此类表时,一些帮助错误消息是:

1. Can't find file: 'college_users' (errno: 2 - No such file or directory)
2. Table 'college.college_batches' doesn't exist

【问题讨论】:

    标签: mysql innodb data-recovery


    【解决方案1】:

    有一个名为dbsake的程序,它有一个名为frmdump的命令。

    解码 MySQL .frm 文件并输出 CREATE VIEW 或 CREATE TABLE 语句。

    此命令不需要 MySQL 服务器,并根据类似于 MySQL 服务器的规则解释 .frm 文件。

    有关此命令如何工作的更多信息,请参阅Description of the .frm format

    例子:

    $ dbsake frmdump --type-codes /var/lib/mysql/mysql/plugin.frm
    --
    -- Table structure for table `plugin`
    -- Created with MySQL Version 5.5.35
    --
    
    CREATE TABLE `plugin` (
      `name` varchar(64) NOT NULL DEFAULT ''  /* MYSQL_TYPE_VARCHAR */,
      `dl` varchar(128) NOT NULL DEFAULT ''  /* MYSQL_TYPE_VARCHAR */,
      PRIMARY KEY (`name`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='MySQL plugins';
    

    更多详情:https://dbsake.readthedocs.io/en/latest/commands/frmdump.html

    【讨论】:

    • 谢谢。你救了我的命。
    【解决方案2】:

    更新:从那时起,我启动了在线工具来从 .frm 文件中恢复结构。 https://recovery.twindb.com/

    要从 actor.frm 文件中恢复结构,请执行以下操作:

    1. 在数据库test中创建dummy table actor(请注意fake中的5.6个字段数必须与原表匹配):

      mysql> use test
      Database changed
      mysql> create table actor(id int);
      Query OK, 0 rows affected (0.01 sec)
      

      对于 5.6,创建语句将是 create table actor(id1 int, id2 int, id3 int, id4 int);。您如何知道表中的实际字段编号。检查以下行的错误日志:

      2014-06-20 03:09:20 3741 [Warning] InnoDB: table test/actor contains 1 user defined columns in InnoDB, but 4 columns in MySQL. Please check INFORMATION_SCHEMA.INNODB_SYS_COLUMNS and http://dev.mysql.com/doc/refman/5.6/en/innodb-troubleshooting.html for how to resolve it
      
    2. 停止 MySQL

    3. 将 /var/lib/mysql/test/actor.frm 替换为您的 actor.frm 文件:

      cp /path/to/my/actor.frm `mysql -NBe"select @@datadir"`/test
      
    4. 用 innodb_force_recovery=6 启动 MySQL

      # cat /etc/my.cnf
      ...
      [mysqld]
      innodb_force_recovery=6
      

      在 Windows 上,将“innodb_force_recovery=6”放到 [mysqld] 组下的 my.ini 文件中。

    5. 启动 MySQL

    6. 读取表actor的结构:

      mysql> show create table actor\G
      *************************** 1. row ***************************
             Table: actor
      Create Table: CREATE TABLE `actor` (
        `actor_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
        `first_name` varchar(45) NOT NULL,
        `last_name` varchar(45) NOT NULL,
        `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
        PRIMARY KEY (`actor_id`),
        KEY `idx_actor_last_name` (`last_name`)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8
      

    【讨论】:

      猜你喜欢
      • 2010-10-27
      • 2013-05-07
      • 1970-01-01
      • 2012-03-12
      • 1970-01-01
      • 2012-11-01
      • 2014-03-09
      • 1970-01-01
      • 2010-11-24
      相关资源
      最近更新 更多