将所有数据库表的引擎更改为InnoDB。

3
我想使用SQL查询,将我的所有数据库表引擎从MyISAM更改为InnoDB。
我尝试了下面的查询语句。虽然它会给我一个成功的消息,但它并没有起作用。仍然使用的是MyISAM存储引擎。
SELECT CONCAT('ALTER TABLE ', table_name, ' ENGINE=InnoDB;') as ExecuteTheseSQLCommands
FROM information_schema.tables WHERE table_schema = 'name_of_the_database' 
ORDER BY table_name DESC;
3个回答

1
我的解决方案 - 打开你的MySQL shell并粘贴:
SELECT CONCAT('ALTER TABLE ',CONCAT(TABLE_SCHEMA,'.',TABLE_NAME),'     
ENGINE=InnoDB;') 
FROM INFORMATION_SCHEMA.TABLES
WHERE ENGINE='MyISAM'
AND TABLE_SCHEMA NOT IN ('MYSQL','INFORMATION_SCHEMA','PERFORMANCE_SCHEMA','SYS')
INTO OUTFILE '/tmp/mysql.conversions';
SOURCE /tmp/mysql.conversions;

来源1: https://computingforgeeks.com/how-to-convert-all-mysql-tables-from-myisam-into-innodb-storage-engine/

来源2: https://dev59.com/SXDYa4cB1Zd3GeqPF_Oo#16014411


1
你应该确保排除系统模式mysqlinformation_schemaperformance_schemasys中的表。在MySQL 5.x中,大多数mysql.*系统表必须使用MyISAM引擎。在MySQL 8.0中,它们已经是InnoDB了,所以不需要修改它们。 - Bill Karwin
此外,您应该在架构名称和表名周围放置反引号,以防万一有人将其表命名为保留字。例如,命名为 order 的表是非常常见的。 - Bill Karwin

1

是的,这就像是将我的查询结果复制粘贴以便执行。谢谢。 - mallix

0

如果我执行您的SQL语句(每个表),它可以工作。我想一次性处理所有表格。使用我的SQL查询,我得到了成功的结果,但是存储引擎没有发生任何变化。 - mallix
3
你的语句只生成一系列看起来像SQL语句的结果,但这些语句实际上并没有被执行。你应该将SELECT语句的输出复制/粘贴到mysql命令中,这样它们就会逐个运行。 - Bastien Jansen
是的,没错。那么有没有一条 SQL 查询语句可以一次性完成这个操作,无论数据库表的数量和名称如何? - mallix
就像我在之前的回答中所说的那样,最简单的解决方案是将先前查询的输出复制/粘贴到一个文件中,然后执行以下操作:mysql -u user -p pwd < yourfile.sql - Bastien Jansen

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