MySQL 5.6.10 InnoDB 无法创建 table 因为 table 已经存在
MySQL 5.6.10 InnoDB cannot create table as table already exists
我有一个非常有趣的案例。我的几个 InnoDB tables 以某种方式损坏了。 tables的.frm文件消失了,只剩下.ibd文件。
我觉得没问题,我会从备份中恢复这些 tables,所以我删除了 .frm 文件并尝试用相同的名称创建新的 tables,但是每次当我得到 "the table already exists" 时,创建了 .ibd 文件,但没有创建 .frm。
基本上现在我无法在给定数据库中使用给定名称创建 InnoDB tables。我唯一的解决方案是改为创建 MyISAM tables,但我仍然想知道如何解决这个问题。
下面是事件的详细日志:
- 尝试创建 table:
CREATE TABLE employee
( employee_id
varchar(20) NOT NULL,
PRIMARY KEY (employee_login_id
) USING BTREE )
ENGINE=InnoDB DEFAULT
CHARSET=utf8 PACK_KEYS=1 ROW_FORMAT=COMPRESSED
table 已经存在
- 尝试删除 table 以表明它不存在:
DROP TABLE employee
table不存在
我手动删除了employee.ibd文件(没有employee.frm文件)
再次尝试 #1 并再次收到 "table already exists"
我已经重启了MySQL,没有变化。
我已经重启了整个服务器,没有任何变化。
我无法再在此 table 空间中创建名为 "employee" 的 InnoDB table。
有什么想法吗?
有关 table 的信息存储在两个地方:
- 服务器范围table.frm文件
- 存储引擎特定的 InnoDB 字典
这两个必须是同步的,但没有可靠的机制来强制这种一致性。由于多种原因,InnoDB 字典不同步。
在你的例子中,字典中有一条孤立的记录。你需要删除它。
InnoDB 不提供任何手动修改字典记录的方法。但是你可以制作一个假的 table.frm(如果 innodb_file_per_table=ON 那么 table.ibd 也是)文件,将它放入数据库目录并删除 table.
旧版本的 InnoDB 可能会抱怨 SPACENO 不匹配。然后检查 how to fix InnoDB dictionary
我有一个非常有趣的案例。我的几个 InnoDB tables 以某种方式损坏了。 tables的.frm文件消失了,只剩下.ibd文件。
我觉得没问题,我会从备份中恢复这些 tables,所以我删除了 .frm 文件并尝试用相同的名称创建新的 tables,但是每次当我得到 "the table already exists" 时,创建了 .ibd 文件,但没有创建 .frm。
基本上现在我无法在给定数据库中使用给定名称创建 InnoDB tables。我唯一的解决方案是改为创建 MyISAM tables,但我仍然想知道如何解决这个问题。
下面是事件的详细日志:
- 尝试创建 table:
CREATE TABLE
employee
(employee_id
varchar(20) NOT NULL,
PRIMARY KEY (employee_login_id
) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 PACK_KEYS=1 ROW_FORMAT=COMPRESSED
table 已经存在
- 尝试删除 table 以表明它不存在:
DROP TABLE employee
table不存在
我手动删除了employee.ibd文件(没有employee.frm文件)
再次尝试 #1 并再次收到 "table already exists"
我已经重启了MySQL,没有变化。 我已经重启了整个服务器,没有任何变化。
我无法再在此 table 空间中创建名为 "employee" 的 InnoDB table。
有什么想法吗?
有关 table 的信息存储在两个地方:
- 服务器范围table.frm文件
- 存储引擎特定的 InnoDB 字典
这两个必须是同步的,但没有可靠的机制来强制这种一致性。由于多种原因,InnoDB 字典不同步。
在你的例子中,字典中有一条孤立的记录。你需要删除它。
InnoDB 不提供任何手动修改字典记录的方法。但是你可以制作一个假的 table.frm(如果 innodb_file_per_table=ON 那么 table.ibd 也是)文件,将它放入数据库目录并删除 table.
旧版本的 InnoDB 可能会抱怨 SPACENO 不匹配。然后检查 how to fix InnoDB dictionary