• 请不要在回答技术问题时复制粘贴 AI 生成的内容
jack778
V2EX  ›  程序员

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

  •  
  •   jack778 · Sep 6, 2021 · 2772 views
    This topic created in 1746 days ago, the information mentioned may be changed or developed.

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

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

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

    所以,不建议数据库进行版本区分
    ideascf
        4
    ideascf  
       Sep 6, 2021
    应用升级也不一定是可以无缝切换的,比如微服务下 RPC 接口改动就是需要考虑向后兼容性。
    如果是数据库的 DDL 和 DML,最好保证 DDL 和 DML 之后老版本服务仍然可以使用。换句话说,升级的时候应该是先更新数据库再更新服务。 具体怎么做:尽量新增字段、枚举等不改变现有数据的方式,等到升级完成之后,再移除字段、枚举等。
    SmiteChow
        5
    SmiteChow  
       Sep 7, 2021
    有兼容问题时只能修复无法回滚
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   846 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 43ms · UTC 20:32 · PVG 04:32 · LAX 13:32 · JFK 16:32
    ♥ Do have faith in what you're doing.