数据库字段扩容与OSC
背景
用户账号中心之前将手机号以明文方式存MySql,合规要求整改,要将数据库中的手机号脱敏。但加密过后的密文长度为65,数据库字段的长度为11,因此要 Modify 为 varchar(100)。但这个表的数据量不小,开发环境都有一千万条记录,贸然扩容肯定会引起生产环境长时间锁表,绝对不可取。
解决方法
OSC,全称 pt-online-schema-change,是一个热修改工具。咨询DBA后,建议OSC执行DDL,可以缩短锁表时间,但整个DDL执行时间会变长。
简单记录下原理:
- 创建一张临时表(表结构则是修改后的表结构),并从源数据表向新表导入数据
- 创建触发器,用于记录从导入数据期间所有操作表(增删改)的操作,主要用于拷贝后执行触发器保证数据不会丢失
- 导入数据结束后短暂锁表然后执行触发器
- 修改源表名为old表,把新表的表名修改为源表名,删除old表
- 删除触发器
可以发现,由于引入了触发器,扩容过程中也可以做DML了,锁表的时间减少,但执行时间变长。