近期在作mysql主从因须要不得不进行数据库引擎更改,而后整理出了一些方法与你们分享若是你有更好的想法能够在评论交流。html
1。查看mysql如今提供引擎。mysql
在mysql命令行下输入sql
show engines;
查看当前默认储存引擎。数据库
mysql> show variables like '%storage_engine%';
查看单个表的引擎。vim
mysql> show create table 表名;
2.修改缺省引擎。
bash
在my.cnf加入而后重启服务服务器
skip-innodb default-storage-engine=MYISAM default-tmp-storage-engine=MYISAM
3.跟换单个数据库引擎
ide
【1】ALTER TABLE
mysql > ALTER TABLE mytable ENGINE=Falcon;
这种语法适合全部引擎,可是转换过程会耗费大量时间。mysql为此要执行一个旧表到新表的逐行复制。在这期间,转换操做可能会占用服务器的全部I/O处理能力,而且在转换时,源表要被读加锁。所以,在一个繁忙的表上作此操做,要加以注意。
若是从一种引擎到另外一种引擎作表转换,全部属于原始引擎的专用特性都会丢失。例如,将一个InnoDB表转换成MyISAM表,再转换回来,最初定义在原InnoDB表上的全部外键都会丢失。
【2】转储(Dump)和导入(Import)
若是想对表转换的过程作更多控制,能够选择使用mysqldump工具,将表先转储成一个文本文件,而后再编辑转储文件,修改其中的CREATE TABLE语句。必定要注意修改表名和引擎类型,由于即便引擎类型有所不一样,同一数据库也不容许存在相同表名的两张表。另外,mysqldump在CREATE TABLE语句以前,会默默地加上DROP TABLE命令,若是不注意,极可能丢失原有数据。工具
mysqldump -uroot -S /tmp/mysql2.sock mysql > *.sql ; mysql -uroot -S /tmp/mysql2.sock db1 < *.sql
在导入以前先修改sql文件spa
vim *.sql
:1,$s/InnoDB/MyISAM/G
此方法在前两种方法之间作了一个平衡,它不转储整张表,或者一次性转换全部数据,而是建立一个新表,使用mysql的INSERT ... SELECT语法来转移数据。
以下:
mysql > CREATE TABLE innodb_table like myisam_table;
mysql > ALTER TABLE innodb_table ENGINE=InnoDB;
mysql > INSERT INTO innodb_table SELECT * FROM myisam_table;
若是数据量不大,这种办法效果不错,可是更高效的办法是增量地填充表,在填充每一个增量数据块的时候都提交事务,这样就不会致使撤销日志变得过于庞大。假定id是主键,能够重复运行下列查询(每次逐次增大x和y的值),直至全部的数据都复制到新表。
mysql > START TRANSACTION;
mysql > INSERT INTO innodb_table SELECT * FROM myisam_table
-> WHERE id BETWEEN x AND y;
mysql > COMMIT;
转移操做完成后,源表扔会保留,能够在操做完成后删除,而此时,新表已被填充完毕。注意:若是有必要,请在转换时加锁源表,避免复制时数据不一致。
出自http://www.cnblogs.com/loveLearning/archive/2013/04/17/3025502.html