IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    MySQL online schema change

    linuxphp@qq.com(keminar)发表于 2015-06-12 23:11:00
    love 0
    贵贵的博客 ( http://blog.linuxphp.org/ ) :

    对于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.要操作的表不能被外键引用



沪ICP备19023445号-2号
友情链接