后端、接口与数据 · 进阶
不停机的表结构迁移
一句话: 用向后兼容的步骤改表结构:先加、再填、再切换,最后才删除。
问题所在
发布过程中,两个版本的代码在同时运行。一次性改掉一列的迁移会弄坏其中一个。所以每一次结构变更都要拆成一串各自独立安全的步骤。
安全的顺序
添加。新增一列,允许为空,不动已有的列。
双写。代码同时写两列,读的时候优先读旧列。
回填。小批量、在非高峰时段、并且能随时停下。
切换读取。在确认数据完全一致之后。
删除。在另一次发布里,并且确认没人再读之后。
谨慎守则
大表上的迁移可能加锁。在你用的引擎上确认加锁行为,并在与生产同等规模的副本上跑一遍。事前备份,以及一份提前写好的回滚脚本——而不是在压力下临时现编。
深入一层
把迁移当作代码放进版本控制,带自动执行和顺序控制。不要把表结构变更和逻辑变更放在同一次发布里:出问题时,你会想知道是这两者中的哪一个。