应用的升级和回滚因为是无状态的,可以进行各种版本的切换这个没问题,但是数据库的升级和回滚可能就要涉及到数据库表结构的 ddl,元数据的 dml 操作,这个如何做到自动同步(回滚)呢? 比如升级的时候删除了表的某列,难道回滚的时候还要去把删除的列加回来吗?你们一般升级应用的时候对于数据库的升级怎么操作的呢?
1
gam2046 2021-09-06 10:21:54 +08:00
一般数据库不建议删除列,以及变更字段的含义,如果需要添加新字段,一般推荐新建表通过外键关联起来,也不是直接添加新字段,这样升级、回退,都不太会出现太大的问题。
|
2
chendy 2021-09-06 10:24:30 +08:00
能不动就不动,影响比较大的修改准备好回滚脚本
其实可以考虑 liquidbase flyway 这些,可以做版本控制,然后走发布 /回滚流程 |
3
penll 2021-09-06 11:09:44 +08:00
同楼上,数据一般不建议直接删除,应改变状态。
然后,实在要让数据也支持版本,就是加个版本的字段,用于区分该数据是哪个版本插入的。 但是,由于新版更新了旧版的数据,就无法回滚,除非又去实现更新流水。那就太麻烦了。 所以,不建议数据库进行版本区分 |
4
ideascf 2021-09-06 13:04:57 +08:00
应用升级也不一定是可以无缝切换的,比如微服务下 RPC 接口改动就是需要考虑向后兼容性。
如果是数据库的 DDL 和 DML,最好保证 DDL 和 DML 之后老版本服务仍然可以使用。换句话说,升级的时候应该是先更新数据库再更新服务。 具体怎么做:尽量新增字段、枚举等不改变现有数据的方式,等到升级完成之后,再移除字段、枚举等。 |
5
SmiteChow 2021-09-07 09:52:45 +08:00
有兼容问题时只能修复无法回滚
|