将MyISAM转换为InnoDB时,(几乎)所有表都显示“表已存在”错误。

3

这应该是很容易的... 我有一个包含大约20个表的数据库,全部都是MyISAM类型。我想要将它们转换为InnoDB,所以我执行了以下语句:

alter table xxxx engine = InnoDB;

作为结果,我得到
ERROR 1050 (42S01): Table './yyy/xxx' already exists

我尝试了几个表格,以为所有的表格都会发生同样的事情,直到我遇到两个正确转换的表格。SHOW TABLE STATUS确认了正确的转换。奇怪的是,其他几个表格有非常相似或相等的结构,但没有转换。
MySQL版本为5.5.27...我尝试通过phpMyAdmin和直接使用mysql命令。结果相同。
注:我找到了下面指示的主题,并进行了一些测试: -我对表格进行了mysqlchk -没问题。 -建议删除表格,表格消失, -然后修复表格报告找不到表格(这是合乎逻辑的)。 -如果我从备份中恢复表格,则出现相同的错误。
可能存在一个并行的InnoDB表格,我看不到吗?

1
也许可以看一下这里的一些答案:https://dev59.com/FXA75IYBdhLWcg3wbocz - takteek
当然,我读了那个帖子。我尝试了几个提出的解决方案,并检查了许多其他邮件中找到的“外键”引用。并非所有的解决方案都可以在这里真正进行“测试”,因为我正在尝试转换,所以我不能真正删除原始数据库。我在原始消息中添加了一些内容。 - jcoppens
我想你可以在不同的架构中创建新表,并使用INSERT .. SELECT复制数据。我真的没有任何好主意,关于是什么导致了你的错误。可能是表文件的权限问题...? - takteek
1个回答

1
公正地说,这个解决方案受到了#takteek指出的讨论串中最后一篇文章的启发。
我认为问题可能是重复的表(原始表在MyISAM中,可能是一些以前实验留下的InnoDB表),所以我决定采用强硬手段:
- DROP DATABASE yyy; - 从备份中恢复MyISAM数据库(停止服务器,untarred the database archive,重新启动服务器)。 - 然后对每个表执行 ALTER TABLES xxx ENGINE InniDB
通常我不喜欢这样激烈的解决方案,因为它们给人一种缺乏工具(或知识)的感觉。在这种情况下,我找不到确认或确认虚假表的方法,也找不到有选择地删除这些表的方法。
无论如何,也许这可以帮助某些人。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接