V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jack778
V2EX  ›  程序员

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

  •  
  •   jack778 · 2021-09-06 09:54:32 +08:00 · 1793 次点击
    这是一个创建于 935 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    所以,不建议数据库进行版本区分
    ideascf
        4
    ideascf  
       2021-09-06 13:04:57 +08:00
    应用升级也不一定是可以无缝切换的,比如微服务下 RPC 接口改动就是需要考虑向后兼容性。
    如果是数据库的 DDL 和 DML,最好保证 DDL 和 DML 之后老版本服务仍然可以使用。换句话说,升级的时候应该是先更新数据库再更新服务。 具体怎么做:尽量新增字段、枚举等不改变现有数据的方式,等到升级完成之后,再移除字段、枚举等。
    SmiteChow
        5
    SmiteChow  
       2021-09-07 09:52:45 +08:00
    有兼容问题时只能修复无法回滚
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5403 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 06:56 · PVG 14:56 · LAX 23:56 · JFK 02:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.