场景描述:
我们的某个业务系统,由于快速增长,导致之前的主键列(自增属性+int类型)即将达到上限,需要变更为bigint类型;
另一方面,由于需要修改的键涉及多个表的关联,且有多点的复制关系,经过测试,单表修改(仅alter table alter column环节)就需要7个小时,严重影响业务;
考虑到alter table带来的锁表时间过长,我利用事务复制,变相进行类型变更操作,实现了快速变更,在大幅提高工效的同时,将alter table无法控制回滚的风险降到最低;
思路:
如果在停机后某个较短的时刻,原DB中存在一份和待修改数据表(TB_A)数据相同但结构不同的数据副本(TB_A_new),那我们就可以通过直接sp_rename(交换表名)的方式来实现字段类型的快速变更;
因此,如何能在停机前实现这个“数据相同但结构不同的数据副本”,就成为我们要解决的关键步骤;而利用事务复制,可以在不停机的前提下实现这一步骤;
在这里,创建事务复制并非完全采用常规方法,这是因为:
SQLSERVER复制中,要求发布的DB不能为同一链路上自身的订阅DB;
即,复制链路不能成环
这似乎与我们的思路矛盾,这里需要通过一些技巧来实现“复制环路”的设想;</