MySQL online schema change

对于MYSQL来讲,小的表alter table很容易,但是一旦数据量变得庞大,此操作就会变成恶梦,尤其是线上业务又不能停。有时没办法只能等重构时加双写,然后业务慢慢转移到新表,这样会耗时很长,而且开发成本也高。有没有什么办法可以实现不改代码的双写呢?我想到了触发器。当然要有root权限才好操作,不过相信都能找到相关的人的哈。

 

基本流程是这样:

1.创建临时表,并和旧表结构一样,然后在新表上增加字段

2.创建触发器,使旧表的操作自动双写到新表上来

3.处理旧数据,分段同步,避免锁表

4.交换新旧表名

5.删除触发器,在运行一段时间确认无误后删除原表

 

如果每次都一行行命令不行,容易出错也累呀。写成工具吧:github上还有一个别人写的ruby版的,ruby不熟悉也不想用,感觉还是自己写的方便。代码如下:https://github.com/keminar/py/tree/master/mysql_online_alter_table

使用方法很简单,一步步来。为了方便没有root权限或是跨机器没有办法root的情况,还可以把触发器导成SQL给有权限的人执行。也可以避免每个机器装一个python2.7

 

刚无意搜索了一下,percona竟然也有一个原理类似的工具叫pt-online-schema-change 好吧。虽然我写的没有你强大,不过算是够用了,而且自定义方便,还有就是思路方向是正确的。这里有篇文章写的不错:http://www.hello-code.com/blog/mysql/201403/3119.html

 

percona的工具一样,使用中有几点要注意的地方:

1.为防止出现 ERROR 1548 (HY000): Cannot load from mysql.proc. The table is probably corrupted 影响正常业务,首次使用请务必在要操作 的机器上创建一个新表和触发器做一次写入测试

2.要操作的表要有主键

3.要操作的表上不能有其它触发器

4.要操作的表不能被外键引用

5.如果发现同步数据时processlist明显变多,立即停止,换个非高峰期时间再执行。

Tags: mysql

上一篇: 使用redis的setbit和bitcount来进行区间统计的坑   下一篇: easy_git简化GIT命令行操作

提交疑问

回顶部