从.frm(no .myd和.myi,ibdada,my.ini)文件中恢复MySQL InnoDB数据/结构

时间:2014-06-23 20:06:12

标签: mysql innodb data-recovery

我试图从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

2 个答案:

答案 0 :(得分:3)

有一个名为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

答案 1 :(得分:1)

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

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

  1. 在数据库测试中创建虚拟表actor(请注意伪造的5.6个字段,原始表必须匹配):

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

    对于5.6,create语句为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
    

    on windows put" innodb_force_recovery = 6"到[mysqld] group下的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