<返回更多

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

2021-10-18    胡理胡途
加入收藏

背景

公司营销系统前段时间出了一个问题,名单表主键是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操作时间很短),但是整体耗时很长。

声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>