修改表结构(如添加字段、添加索引)会给数据表加表级锁,当表中数据量较大时,会导致阻塞时间很长。
那么对于数据量大的表,如何在线修改表结构呢?
一、方法一–滚动升级
停掉mysql服务器来修改表结构,然后进行滚动式更新:
1、比如很多台mysql服务器,先把主服务器停掉来更新(一般多台主服务器,让其他主服务器提供服务)
2、等到更新完,就滚动到从服务器(在此之前是其他从服务器提供服务的)
这种方案必须能够停掉mysql服务器来修改字段,mysql服务器越多,就需要的时间越长,只有等到更新完毕,才能把部署上线新的业务逻辑。
二、方案二–使用专门的pt-online-schame-change工具
这些工具的原理为:
1、创建一个新表tmp_names
2、执行insert into tmp_names(****) select ***** from video_name;
3、删除video_names
4、重命名tmp_name为video_names;语句为rename table tmp_names to video_names;
5、当在执行期间,数据有更新如何处理?
工具的解决办法思路是,在原表中创建几个触发器,针对uptate、delete 、insert操作都记录下来,这样子把对原表的操作记录下来,方便更新到新建立的表中去。
参考:
1、https://juejin.cn/post/6993339537824940046
2、https://www.cnblogs.com/wangtao_20/p/3504395.html
1、从开发者视角学习MYSQl系列文章:https://blog.csdn.net/maoxuemin/article/details/123523457;
2、快速问答:https://gitee.com/wendakuai/introducton/wikis/question