ning_lianjie 发表于 2012-12-17 22:19

【分享】MySQL中rename命令浅析

本帖最后由 cenalulu 于 2012-12-20 09:58 编辑

今天遇到的问题:
一个表,大小50G,数据3千万条;
新数据插入频繁,读取很少;
要保证写入/查询的效率,需要清空已经存在的数据.

提议有两种办法:
1.truncate
2.rename

最初我认为rename是把数据copy到临时表.今天做了如下测试,发现并非这样.
测试:
1.在test库中,有t1,t2表.
2.执行21:52:37 127.0.0.1:3306 test>rename table t1 to t2;      
ERROR 1050 (42S01): Table 't2' already exists3.把t1表删除,再次执行21:52:37 127.0.0.1:3306 test>rename table t1 to t2;      
ERROR 1017 (HY000): Can't find file: './test/t1.frm' (errno: 2)4.将t1还原,并且把t2删除,执行rename命令,结果:正确执行.
但是查看.frm文件和.ibd文件,都是最新的.

疑问:
rename 操作,如果不涉及任何数据的更改,而只是简单的更改.frm文件,为何也修改了.ibd文件

devilkin0312 发表于 2012-12-18 17:45

个人理解rename 的过程:
1.lock table a
2.create table b (同结构)
3.insert into b select * from a
4.unlock and drop table a

ning_lianjie 发表于 2012-12-18 20:35

回复 2# devilkin0312

不是这个过程.应该没有数据导出导入.直接修改.frm文件
   

devilkin0312 发表于 2012-12-19 12:06

回复 3# ning_lianjie


    刚刚用innodb,mysiam测试了下,这个过程确实没有复制数据的操作,只是对表相关文件(.frm,.myd,myi)和元数据信息进行修改。

ning_lianjie 发表于 2012-12-19 15:00

回复 4# devilkin0312

对于大表的清理工作.为了不影响新数据写入.可以用rename来替换truncate命令.

   

cenalulu 发表于 2012-12-20 09:59

所以production的大表变更也是这么做的。
pt-online-schema-change 用的也是这个原理

ning_lianjie 发表于 2012-12-20 14:44

回复 6# cenalulu

对了,请教个问题,上T的表,进行备份有没有好的方式.
有没有热备,但是不会太占资源的工具,时间长点无所谓.
   

cenalulu 发表于 2012-12-20 15:01

回复 7# ning_lianjie

用物理备份 xtrabackup 加上 io-throttle 参数控制对磁盘的占用
   

ning_lianjie 发表于 2012-12-20 15:43

回复 8# cenalulu
3q ,去测试一下,看看效果.

   

G8bao7 发表于 2012-12-20 17:38

回复 4# devilkin0312

UP!
看源码中也是直接对数据文件直接重命名,而不是insert


   
页: [1] 2
查看完整版本: 【分享】MySQL中rename命令浅析