我们时常遇到SaaS业务场景需要变更数据库表结构的情况,当我们对其变更时,如何保证生产环境的业务不受影响呢?
数据库变更,无非就三种情况,增、删、改。
下面来逐一分析下各种变更的实际应该如何操作:
1.增加字段
这种通常给默认值,旧代码就能适应,这种可以先变更数据库,再发代码
2.删除字段
应该先发代码,再执行变更,原因是如果先删字段,可能生产环境的旧代码有用到这个字段,而先变更会导致把字段删了,而代码有调用。
但是如果旧字段没有默认值呢?要先给旧字段添加默认值,否则新代码已经不需要这个字段,但是表的旧字段没删,但是表的旧字段又有必填,且没有默认值,一个保存操作,就gg了,新代码保存时会丢数据
3.变更字段(将字段A改成字段B)
方案1:
- 先添加一个字段B,并且将字段A的值拷贝到B中,并且建立触发器,将后续A的变更都同步到B,将B的变更,也同步到A,并且给字段B设定默认值**
- 发代码(这样发布期间,新旧代码共存时,旧代码能读到A,新代码能读到B,那此时如果旧代码对A的变更如何反馈到B呢?用步骤a的触发器将旧代码对A做的变更反馈到B上,同步也将新代码的变更反馈到旧的A字段上以适应旧代码),这一步最好将旧字段A也加上默认值,以适应新代码保存逻辑
- 最后再执行删除A的数据库变更
方案2:
1.先添加字段B
2.发新代码,保证双写(增改都要双写),但是前提:读,先保证新代码读旧字段A。
3.写对账脚本,用脚本对账A, B两个字段,以保证两个字段的一致性
4.再改代码,让新代码读新字段B,再发代码,此时新旧业务上都能正常。
5.再改代码,取消双写,只写新,发代码
6.删除旧字段A
整理导图如下:~~~~
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。