二、背景
嘟!嘟!嘟!
你好,我今晚要上线新功能,有个改表帮我处理一下呗。
你好,我有个亿级(十亿)表,需要加个字段/索引帮我处理一下呗。
你好,我刚加了一个字段,小表半小时还没加完,而且现在好像写不了数据。
DBA 们应该经常会接到这种需求吧。
DDL 操作可能是 DBA 最头疼的一项工作之一,也是最日常的一项工作了。动不动就要加个字段,扩个长度。如果不幸前期设计不合理的系统,那后期维护起来就真的是叫爹骂娘的问候。如果又不幸是接盘跑了八百年的业务表需要上线新功能加一两字段或者扩个长度啥的,简直酸爽到飞。
MySQL 5.6 开始支持 OnlineDDL,美美地敲了回车,等半天还是没反应,撸了一把又一把,业务催了一遍又一遍,猥琐发育都二胎了,就是没结束,在三胎之后终于跑完了,然后你就躺下刷了会手机,想找点安慰告别努力工作的一天,结果发现又是绿油油的一天,怒扔手机睡觉去了,不曾想刚酝酿了一会睡意,麻烦又来了。
业务疯狂的打电话,很不情愿的接通了。业务反馈很多订单返回的数据都有问题。机智的你猜到了肯定是改表导致了延迟,业务还是一顿吐槽,吧啦吧啦说一大堆,还得起来把读流量切到主库,有没有很酸爽。
为啥会这样呢,我们就来掰扯掰扯这个问题。
MySQL 的 DDL 操作主要有两种方式 copy 和 inplace。copy 表需要全程锁表,对业务影响极大,inplace 不阻塞 dml 操作。但是 MySQL 5.6 推出 OnlineDDL 以前,基本干啥 copy,干啥啥不行,干啥啥锁表。5.6 版本推出 OnlineDDL,DBA 们简直爱的不要不要了。但是 inplace?就真的很爱了吗。别忘了,inplace 分为 rebuild 和 no-rebuild,这就能解释了为啥很多操作还是很慢了。原因就是:【NOMM】。
既然 OnlineDDL 还是有那么多问题,那我们该咋整呢?这还只是一个 DDL 操作,如果很多呢,几十上百个 DDL 需求,是不是要疯,枸杞红枣肾宝片是不是得搞起来了。但是别慌,还有后招。生活是很美好的,比如骑上小电驴就可以送外卖了。
废话时间结束,现在言归正传,来聊聊改表工单系统-后台逻辑是怎么实现的?