生产环境在进行应用版本的升级和回退时针对数据库的变更如何做到同步?

2021-09-06 09:54:32 +08:00
 jack778

应用的升级和回滚因为是无状态的,可以进行各种版本的切换这个没问题,但是数据库的升级和回滚可能就要涉及到数据库表结构的 ddl,元数据的 dml 操作,这个如何做到自动同步(回滚)呢? 比如升级的时候删除了表的某列,难道回滚的时候还要去把删除的列加回来吗?你们一般升级应用的时候对于数据库的升级怎么操作的呢?

2077 次点击
所在节点    程序员
5 条回复
gam2046
2021-09-06 10:21:54 +08:00
一般数据库不建议删除列,以及变更字段的含义,如果需要添加新字段,一般推荐新建表通过外键关联起来,也不是直接添加新字段,这样升级、回退,都不太会出现太大的问题。
chendy
2021-09-06 10:24:30 +08:00
能不动就不动,影响比较大的修改准备好回滚脚本
其实可以考虑 liquidbase flyway 这些,可以做版本控制,然后走发布 /回滚流程
penll
2021-09-06 11:09:44 +08:00
同楼上,数据一般不建议直接删除,应改变状态。

然后,实在要让数据也支持版本,就是加个版本的字段,用于区分该数据是哪个版本插入的。
但是,由于新版更新了旧版的数据,就无法回滚,除非又去实现更新流水。那就太麻烦了。

所以,不建议数据库进行版本区分
ideascf
2021-09-06 13:04:57 +08:00
应用升级也不一定是可以无缝切换的,比如微服务下 RPC 接口改动就是需要考虑向后兼容性。
如果是数据库的 DDL 和 DML,最好保证 DDL 和 DML 之后老版本服务仍然可以使用。换句话说,升级的时候应该是先更新数据库再更新服务。 具体怎么做:尽量新增字段、枚举等不改变现有数据的方式,等到升级完成之后,再移除字段、枚举等。
SmiteChow
2021-09-07 09:52:45 +08:00
有兼容问题时只能修复无法回滚

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/800082

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX