快捷搜索:   nginx

把MySql数据库中的MyISAM引擎表转换为InnoDB引擎

MySQL中的MyISAM和InnoDB有什么区别,在这儿就不哆嗦了。一个好比便利店,一个好比大型购物中心,他们是为了适应不同的场合而存在的。当流量比较小,我们可以用MyISAM,当流量大时,我们可能会把数据库中的,全部表或者部分表转换成InnoDB。下面说2种切实可行的方法来完成这种转换。
 
1、转换单个表:
 


ALTER TABLE 数据表 TYPE=InnoDB;
 

2、批量转换多个表:

\! rm -f /tmp/admpub_com_alter.sql #预删除临时文件,方式下面的语句无法写入
 
 
SELECT concat('alter table `', TABLE_SCHEMA, '`.`', TABLE_NAME, '` engine=innodb;')
FROM information_schema.TABLES
WHERE ENGINE='Myisam' AND
       TABLE_SCHEMA<>'mysql' AND
       TABLE_SCHEMA<>'information_schema'
INTO OUTFILE '/tmp/admpub_com_alter.sql' ;
 
source /tmp/admpub_com_alter.sql
 
\! rm -f /tmp/admpub_com_alter.sql #执行完后删除临时文件
 

在大表的转换中,你应该增加InnoDB缓冲池的大小来减少磁盘I/O。尽管如此,不要使用超过80%的内部内存。你也可以增加InnoDB日志文件和日志文件的大小。

确信你没有填满表空间:InnoDB表比MyISAM表需要大得多的磁盘空间。如果一个ALTER TABLE耗尽了空间,它就开始一个回滚,并且如果它是磁盘绑定的,回滚可能要几个小时。对于插入,InnoDB使用插入缓冲区来以成批地合并第二个索引记录到索引中。那样节省了大量磁盘I/O。在回滚中,没有使用这样的机制,而回滚要花比插入长30倍的时间来完成。

在失控的回滚情况下,如果你在数据库中没有有价值的数据,比较明智的是杀掉数据库进程而不是等几百万个磁盘I/O被完成。

顶(1)
踩(0)

您可能还会对下面的文章感兴趣:

最新评论