咱们时常遇到 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
整顿导图如下:~~~~