我们时常遇到SaaS业务场景需要变更数据库表结构的情况,当我们对其变更时,如何保证生产环境的业务不受影响呢?

数据库变更,无非就三种情况,增、删、改。

下面来逐一分析下各种变更的实际应该如何操作:

1.增加字段

这种通常给默认值,旧代码就能适应,这种可以先变更数据库,再发代码

2.删除字段

应该先发代码,再执行变更,原因是如果先删字段,可能生产环境的旧代码有用到这个字段,而先变更会导致把字段删了,而代码有调用。

但是如果旧字段没有默认值呢?要先给旧字段添加默认值,否则新代码已经不需要这个字段,但是表的旧字段没删,但是表的旧字段又有必填,且没有默认值,一个保存操作,就gg了,新代码保存时会丢数据

3.变更字段(将字段A改成字段B)

方案1

  1. 先添加一个字段B,并且将字段A的值拷贝到B中,并且建立触发器,将后续A的变更都同步到B,将B的变更,也同步到A,并且给字段B设定默认值**
  2. 发代码(这样发布期间,新旧代码共存时,旧代码能读到A,新代码能读到B,那此时如果旧代码对A的变更如何反馈到B呢?用步骤a的触发器将旧代码对A做的变更反馈到B上,同步也将新代码的变更反馈到旧的A字段上以适应旧代码),这一步最好将旧字段A也加上默认值以适应新代码保存逻辑
  3. 最后再执行删除A的数据库变更

方案2:

1.先添加字段B

2.发新代码,保证双写(增改都要双写),但是前提:读,先保证新代码读旧字段A

3.写对账脚本,用脚本对账A, B两个字段,以保证两个字段的一致性

4.再改代码让新代码读新字段B再发代码,此时新旧业务上都能正常。

5.再改代码,取消双写只写新,发代码

6.删除旧字段A

整理导图如下:~~~~

image.png


码农漫谈
35 声望1 粉丝

专注web开发,后台开发,DB性能及架构