mysql引擎更改

回复 收藏
本帖最后由 zjw1997 于 2015-5-30 11:18 编辑

近期在做mysql主从因需要不得不进行数据库引擎更改,然后整理出了一些方法与大家分享如果你有更好的想法可以在评论交流。http://jzzjw.blog.51cto.com/9921462/1656587

1。查看mysql现在提供引擎。
在mysql命令行下输入
show engines;
查看当前默认储存引擎。
mysql> show variables like '%storage_engine%';
查看单个表的引擎。
mysql> show create table 表名;
2.修改缺省引擎。
在my.cnf加入然后重启服务
skip-innodb
default-storage-engine=MYISAM
default-tmp-storage-engine=MYISAM
3.跟换单个数据库引擎
出自http://www.cnblogs.com/loveLearn ... /04/17/3025502.html
【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命令,如果不注意,很可能丢失原有数据。
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;

转移操作完成后,源表扔会保留,可以在操作完成后删除,而此时,新表已被填充完毕。注意:如果有必要,请在转换时加锁源表,避免复制时数据不一致。


2015-05-30 09:27 举报
已邀请:
0

lyhabc

赞同来自:

本帖最后由 lyhabc 于 2015-5-30 13:57 编辑

第二种的弊端你知道吗?你 insert的过程中数据被update过,或者已经delete了,除非你的表只有insert语句和select不会有update语句和delete语句!!
mysql > START TRANSACTION;
mysql > INSERT INTO innodb_table SELECT * FROM myisam_table
-> WHERE id BETWEEN x AND y;
mysql > COMMIT;

注意:如果有必要,请在转换时加锁源表,避免复制时数据不一致。
锁表跟第一种方法没有太大差别!!!

mysql > ALTER TABLE mytable ENGINE=Falcon;

所以,对于大表,你的方法根本没有用!!!!!!!!!!!!!!
0

zjw1997

赞同来自:

lyhabc 发表于 2015-5-30 13:56
第二种的弊端你知道吗?你 insert的过程中数据被update过,或者已经delete了,除非你的表只有insert语句和s ...

感谢指正问题  这些是我在网上搜的补充资料 我是数据库小白 也看不出问题 希望以后多多交流一起进步 {:4_120:}

回复帖子,请先登录注册

退出全屏模式 全屏模式 回复
评分
可选评分理由: