InnoDB 表被制作为 MyISAM

Posted

技术标签:

【中文标题】InnoDB 表被制作为 MyISAM【英文标题】:InnoDB tables being made as MyISAM 【发布时间】:2011-12-23 08:26:16 【问题描述】:

我使用 phpmyadmin 在本地创建我的数据库表。我将他们的引擎设置为 innoDB 并使用 phpmyadmin 创建外键关系。这一切都在本地工作。

但是,如果我尝试将这些表导出到生产站点,这些表将创建为 MYISAM,并且通过创建列上的索引,它们不会作为外键链接到另一个表。

任何想法为什么会发生这种情况?

要导出表,我只需在 PhpMyAdmin 中转到 Export,这是我在生产站点上运行的查询示例:

CREATE TABLE IF NOT EXISTS `foo` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `barId` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `barId` (`barId`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;


ALTER TABLE `foo`
  ADD CONSTRAINT `foo_ibfk_1` FOREIGN KEY (`barId`) REFERENCES `barTable` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION;

这确实会创建表并在 barId 上创建索引,但表引擎是 myisam 而不是 inno,并且 barId 上没有引用 barTable.id 的外键

【问题讨论】:

prod DB 是否支持 InnoDB? +1 @Dave Newton 的回答。键入SHOW ENGINES; 以查看远程服务器端支持哪些数据库引擎。 @vic 是的,它支持 InnoDb,我可以手动切换到 inno db 回答第二个问题,MYISAM 不支持外键,这就是为什么你的 ALTER 语句没有创建 FK。如果您的表被正确地创建为 INNODB,则 FK 创建将起作用。接下来——在 phpMyAdmin 中,您是否会转到 prod 服务器上的变量选项卡并查看“默认存储引擎”和“存储引擎”的内容?我还希望您查看 phpMyAdmin 目录中的 config.inc.php 文件,看看那里是否有任何选项强制 MISAM 创建表。待续…… ...继续。最后,我希望您从 mysql 控制台运行您的 CREATE 并查看它是否产生任何警告。如果是,请键入 SHOW WARNINGS 以查看它们。您还可以在存储日志的任何位置(在 /etc/my.cnf 中找到)找到这些消息。例如,我的日志在 /var/log/mysqld.log 中。 【参考方案1】:

根据您的说法,生产数据库服务器似乎忽略了那里的 ENGINE=InnoDB 子句。

您是否检查以确保在生产服务器上启用了 InnoDB?

【讨论】:

以上是关于InnoDB 表被制作为 MyISAM的主要内容,如果未能解决你的问题,请参考以下文章

mysql之存储引擎的选择

数据库数据恢复华为云mysql数据库表被truncate,部分表数据被delete的数据恢复案例

存储引擎

MySQL优化

Mysql系列:存储引擎

mysql--数据库优化