MySQL 5.6.10 InnoDB无法创建表,因为表已经存在

时间:2015-01-30 15:18:06

标签: mysql innodb

我有一个非常有趣的案例。我的几个InnoDB表已经被破坏了。表的.frm文件消失了,只留下了.ibd文件。

我认为没问题,我会从备份中恢复这些表,所以我删除了.frm文件并尝试创建具有相同名称的新表,但每次我得到"该表已经存在&# 34;,.ibd文件被创建,但.frm没有。

基本上我现在无法在给定数据库中创建具有给定名称的InnoDB表。我唯一的解决方案是创建MyISAM表,但我仍然想知道如何解决这个问题。

以下是事件的详细日志:

  1. 尝试创建表格:
  2.   

    CREATE TABLE employee   (employee_id varchar(20)NOT NULL,
      PRIMARY KEY(employee_login_id)使用BTREE)   ENGINE = InnoDB DEFAULT   CHARSET = utf8 PACK_KEYS = 1 ROW_FORMAT = COMPRESSED

    表已存在

    1. 尝试删除表格以表明它不存在:
    2.   

      DROP TABLE员工

      表格不存在

      1. 我手动删除了employee.ibd文件(没有employee.frm文件)

      2. 再次尝试#1并收到"表已存在"再次

      3. 我重启了MySQL,没有变化。 我重启了整个服务器,没有变化。

        我无法使用名称" employee"创建一个InnoDB表。在这个表空间中。

        有什么想法吗?

1 个答案:

答案 0 :(得分:3)

有关表格的信息存储在两个地方:

  1. 服务器范围的table.frm文件
  2. 特定于存储引擎的InnoDB字典
  3. 这两者必须同步,但没有可靠的机制来强制实现这种一致性。由于InnoDB字典不同步的原因。

    在您的情况下,字典中有一个孤立的记录。你需要删除它。

    InnoDB没有提供任何手动修改字典记录的方法。但你可以制作一个假的table.frm(如果innodb_file_per_table = ON,那么也是table.ibd)文件,将它放入数据库目录并删除表。

    旧版本的InnoDB可能会抱怨SPACENO不匹配。然后查看how to fix InnoDB dictionary