【分享】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文件
个人理解rename 的过程:
1.lock table a
2.create table b (同结构)
3.insert into b select * from a
4.unlock and drop table a
回复 2# devilkin0312
不是这个过程.应该没有数据导出导入.直接修改.frm文件
回复 3# ning_lianjie
刚刚用innodb,mysiam测试了下,这个过程确实没有复制数据的操作,只是对表相关文件(.frm,.myd,myi)和元数据信息进行修改。 回复 4# devilkin0312
嗯
对于大表的清理工作.为了不影响新数据写入.可以用rename来替换truncate命令.
所以production的大表变更也是这么做的。
pt-online-schema-change 用的也是这个原理 回复 6# cenalulu
对了,请教个问题,上T的表,进行备份有没有好的方式.
有没有热备,但是不会太占资源的工具,时间长点无所谓.
回复 7# ning_lianjie
用物理备份 xtrabackup 加上 io-throttle 参数控制对磁盘的占用
回复 8# cenalulu
3q ,去测试一下,看看效果.
回复 4# devilkin0312
UP!
看源码中也是直接对数据文件直接重命名,而不是insert
页:
[1]
2