2009-11-26 84 views
4

我一直在向MySQL数据库添加表,方法是将&从文件粘贴到mysql命令行应用程序中。我的过程是从文件复制CREATE TABLE语句并将其粘贴到我的开发数据库中,然后将其粘贴到另一台机器上的测试数据库中。我是唯一使用测试数据库的人。我的CREATE TABLE语句指定Engine = InnoDB。测试数据库启用了InnoDB。意外的MySQL表引擎更改?

最近另一位开发人员发现测试数据库上的表都是MyISAM表。我检查了我的文件,它仍然说“引擎= InnoDB”的一切。我检查了我的开发数据库,​​那里的表是Engine = InnoDB。

为了证明测试数据库与InnoDB没有问题,我只需要ALTER TABLED将引擎设置为所有表上的InnoDB。

我希望我只是复制&粘贴或其他愚蠢的错误。但它似乎很奇怪,所有测试表是MyISAM ...当然,我不能是我的错误一致。使用mysqldump完成所有备份&恢复。

有没有一种无意中更换引擎的方法?

回答

4

我认为这是众所周知的MySQL陷阱的另一个实例;我自己也碰到过几次这个问题。

基本上问题是,如果InnoDB引擎无论何种原因无法启动(通常是配置问题) - 那么MySQL会默默地回退到MyISAM引擎。即使你的声明说:

CREATE TABLE (...) ENGINE=InnoDB; 

然后,如果InnoDB的不活跃,MySQL将高兴地创建一个MyISAM表,甚至没有警告你。即使您后来发现并修复InnoDB问题,在问题期间创建的所有表仍然保留MyISAM。再见数据完整性! :)

您可以运行SHOW ENGINES以查看哪些引擎处于活动状态。有关更多详细信息,请参阅this MySQL bug report

+1

这不会发生在现代版本;如果InnoDB无法启动,将导致服务器启动失败。另一方面,如果它在配置中被禁用,它仍然会替代引擎。 – MarkR 2009-11-26 07:51:33

+0

谢谢,我不知道。 :) – intgr 2009-11-26 10:34:37