公司营销系统前段时间出了一个问题,名单表主键是INT类型,经过4年的业务发展,名单ID超过了21亿,到达了INT类型的阈值,导致无法接收新的营销名单。
发现问题原因后,第一时间联系DBA,请他们帮忙执行一条ddl语句,将名单ID字段类型由INT调整为BIGINT。
很遗憾,由于表的存量数据有5000多万,ddl无法短时间执行成功。为了避免线上联机业务长时间受到影响,只能想别的办法。
名单ID最大值是INT的极大值,存量数据5000多万,20多亿历史数据是被迁移备份归档了的。
联系到每天新增名单200万左右,所以新办法的第一步就是将最进500万数据的ID,平移到一个历史区间,这样就腾出了500万的ID空间,让新名单能正常接入,保证业务短期正常。
第一次自救失败,主要原因是直接修改表字段类型是阻塞式修改,直接影响了线上业务。所以新办法的第二步就是无阻塞修改表字段类型。DBA推荐了一款工具,PT-ONLINE-SCHEMA-CHANGE,能修改schema而不阻塞其他数据库操作。
它的原理分为四步:
整个过程几乎不堵塞的(rename 操作会堵塞,但是rename操作时间很短),但是整体耗时很长。