将表从一个引擎改为另一个引擎的方法
方法1:
最简单的方法
alter table test engine=innodb;
但是如果表数据量大,则需要执行很长时间。因为mysql会按行将数据从原表复制到新表,在复制期间可能会消耗系统所有的IO,同时原表上会加读锁,所以业务繁忙的表要小心该操作。
方法2:
一种解决方案是使用导出导入
- 使用mysqldump导出文件
- 修改文件中的create table语句的存储引擎选项,同时修改表名(注意:mysqldump会在create table前加上drop table语句,不注意可能导致数据丢失)
- 导入文件
-
方法3:
先创建新存储引擎的表,然后使用insert。。。select语法导数据
数据量不大时:
mysql> create table test_innodb like test_myisam;
mysql> alter table test_innodb engine=innodb;
mysql> insert into test_innodb select * from test_myisam;
数据量大时,可以分批处理,避免大事务产生过多的undo
mysql>start transaction;
mysql>insert into test_innodb select * from test_myisam where id between a and b;
mysql>commit;
方法4:
使用percona toolkit提供的pt_online-schema-change的工具实现在线schema变更
# pt-online-schema-change -u root -p beijing --alter "ENGINE=MyISAM" --execute D=miles,t=actor
该工具详细使用方式请参考
https://www.percona.com/doc/percona-toolkit/2.2/pt-online-schema-change.html