MySQL小技巧:INT类型到达阈值,动态修改表schema失败怎么办

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

  1. 新建一个变更过schema后的表;
  2. 再在原表上建update触发器、delete触发器、insert触发器,确保新的DML操作能同步到新表;
  3. 再将原表的数据到按照主键ID分区间拷贝到新表;
  4. 最后待数据copy完成后,将新表rename成老表 。
整个过程几乎不堵塞的(rename 操作会堵塞,但是rename操作时间很短),但是整体耗时很长 。




    推荐阅读