大表在线修改结构踩坑记

Posted by Kerr on Thu, Jul 5, 2018

起因

公司的用Yearning SQL 用作线上的 DDL 工具,该工具由于关闭支持外键,从而触发 mysql 更改表自动更换外键约束表名的问题,从而导致事故。

原由

先看下这个工具执行 DDL 的原理。

    1. 复制原表,新表命名方式:“_”+原表名+“_new”
    1. 在新表上进行DDL操作
    1. 在原表上创建触发器,将原表上的增删改操作同步至新表
    1. 分批次复制原表数据至新表
    1. 数据追上以后,原表新表互换表名,此处锁表。原表更名为:“_”+原表名+“_old”
    1. 删除原表
    1. 删除触发器

分析

第5步当重命名表名时,mysql 会自动将外键约束表名更改掉。导致这一步不可逆。

总结

当采用一些工具来 DDL 时,如果采用表替代方案,千万记得查看是否有外键约束。否则造成线上事故吃瓜蒌。

参考