MySQL:如何在生产数据库中将多个MyISAM表转换为InnoDB?

我们有一个完全由MyISAM表组成的生产数据库。 我们正在考虑将它们转换为InnoDB以获得更好的并发性和可靠性。

  1. 我可以在不closuresMySQL的情况下将myISAM表更改为InnoDB吗? 这里推荐的程序是什么?

  2. 这种转换需要多长时间? 所有的表格总大小约700MB

  3. 有相当多的表格。 有没有办法将ALTER TABLE一次应用到所有的MyISAM表格,而不是一个一个的去做?

  4. 任何我需要注意的陷阱?

谢谢

你能行的。 因为InnoDB具有MyISAM中没有的更多function,例如事务处理,所以从MyISAM到InnoDB的转换应该不成问题。

您可以在数据库运行时更改这些表。 不需要closures,但是这个操作会locking表格。

一段时间,这取决于服务器规格/负载/分贝大小等。

您可以使用脚本来实现stream程的自动化。 使用命令show tables ,你可以得到表的列表。 然后,使用一个简单的脚本,你可以读取这个列表并执行alter table命令。

这是一个简单的perl脚本,它将从文件中读取表列表并将SQL查询写入另一个文件中。 在调用这个脚本之后,你可以将输出文件提供给mysql命令来完成所需的更改。

 open(INFILE, "< tables_list.txt"); open(OUTFILE, "> alter_tables.sql"); foreach my $name (<INFILE>) { chomp($name); print OUTFILE "ALTER TABLE $name engine=InnoDB;\n"; } close(INFILE); close(OUTFILE); 

我使用CREATE和SELECT:

  mysql> CREATE TABLE i_table LIKE table; mysql> ALTER TABLE i_table ENGINE=InnoDB; mysql> INSERT INTO i_table SELECT * FROM table; mysql> RENAME TABLE table TO b_table; mysql> RENAME TABLE i_ TO other_db.tbl_name; 

如果你没有太多的数据,那效果很好。 更好地使用

 mysql> ALTER TABLE table ENGINE = InnoDB; 

在繁忙的数据库上尝试这种方法之前要小心。

您也可以转储数据库,将转储文件中的ENGINE和转储文件中的DATABASE名称更改。 还原数据库然后重命名数据库。

Khaled和ooshro是否涵盖了语义; 问题2和4很难判断,因为它取决于你的configuration和硬件。 你可以为#2做的是将数据库转储到一个文件,并将其导入到工作站或其他服务器(去购买一个云切片$ 5,如果你必须使用),然后尝试执行你的改变选项,看看多长时间只需要一般的,整体的意义。 这不是一个完美的testing,但总比没有好 – 700MB不是很大,如果你的MySQL是在一个专用的服务器上(例如戴尔2970 w / 16g内存),不会花费太长时间。

#4 – 不要将MySQL /数据库转换为InnoDB。 :)总的来说,这个过程会在运行时产生一个完整的表锁(实际上,在后台创build一个新表,传输数据,然后删除/重命名它),以便在下class时间更改引擎在晚上。 确保你得到一个完整的转储,以防万一出现问题。 (mysqldump -A –flush-privileges> dbdump.sql)。

我有一个自动的方式来使用MySQL将MyISAM转换为InnoDB

以下是在每个数据库中为MyISAM表生成SQL的查询:

 SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=InnoDB;') InnoDBConversionSQL FROM information_schema.tables WHERE engine='MyISAM' AND table_schema NOT IN ('information_schema','mysql','performance_schema') ORDER BY (data_length+index_length); 

在Linux提示符下,运行脚本创build,如下所示:

 mysql -h... -u... -p.... -A --skip-column-names -e"SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=InnoDB;') InnoDBConversionSQL FROM information_schema.tables WHERE engine='MyISAM' AND table_schema NOT IN ('information_schema','mysql','performance_schema') ORDER BY (data_length+index_length)" > MyISAM_To_InnoDB.sql 

这将生成SQL以将所有数据库中的每个MyISAM表从最小的表转换为最大的表。

你可以很容易地调整SQL来将所有MyISAM表转换成InnoDB,像这样的特定数据库(例如数据库mystuff):

 mysql -h... -u... -p.... -A --skip-column-names -e"SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=InnoDB;') InnoDBConversionSQL FROM information_schema.tables WHERE engine='MyISAM' AND table_schema = 'mystuff' ORDER BY (data_length+index_length)" > MyISAM_To_InnoDB.sql