V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
yiyiniu
V2EX  ›  程序员

软件管理:通过什么方式能保障测试环境与生产环境:表结构、表的初始化数据一致?

  •  
  •   yiyiniu · 2024-08-12 10:10:38 +08:00 · 4248 次点击
    这是一个创建于 386 天前的主题,其中的信息可能已经有所发展或是发生改变。

    场景描述

    软件项目开发过程中:有测试环境、生产环境

    1. 大家经常在测试环境中,数据库里添加表、添加字段、添加了初始化的数据了
    2. 上线生产环境时,总是会发现:某个表的字段没有添加,初始化的一个配置表数据没初始化上。

    请问大家有什么好的方式:能通知或者记录或者其他形式,来避免这种配置数据呀、表结构呀遗漏的问题呢?

    目前通过 Gitlab 实现代码统一管理; 通过 Navicat 中数据库结构的比较,避免表结构的遗漏; 但是仍有一些初始化的数据,在上线后会遗漏。

    45 条回复    2024-08-22 10:44:09 +08:00
    t298
        1
    t298  
       2024-08-12 10:15:12 +08:00   ❤️ 2
    Flyway?
    jmllx1963
        2
    jmllx1963  
       2024-08-12 10:16:41 +08:00
    forvvvv123
        3
    forvvvv123  
       2024-08-12 10:19:24 +08:00   ❤️ 3
    把大家测试环境 DB 的建表和修改表权限全回收了,然后做个网页工具管理表结构,测试环境生产环境也只有这个工具有权限改,所有变动只能 网页工具=>改测试环境=>改生产环境; 这样就行了;

    然后定个规定,私自搭建测试环境 db 罚钱;
    linjian
        4
    linjian  
       2024-08-12 10:21:23 +08:00
    liquibase
    InkStone
        5
    InkStone  
       2024-08-12 10:24:15 +08:00
    赞同三楼,这种一致性需要流程保障
    28Sv0ngQfIE7Yloe
        6
    28Sv0ngQfIE7Yloe  
       2024-08-12 10:26:13 +08:00
    alter table 以及 create table 的操作都要放到 migrate 脚本里,并且准备好执行失败的回滚脚本
    pangdundun996
        7
    pangdundun996  
       2024-08-12 10:28:00 +08:00
    ddl 也作为交付物放到 git 中管理起来,标准化需求上线 checklist
    Mystery0
        8
    Mystery0  
       2024-08-12 10:29:17 +08:00
    上生产谁的 sql 出问题就扣钱,执行一段时间之后,开发人员自己会想办法做一个流程来避免问题
    fds
        9
    fds  
       2024-08-12 10:30:40 +08:00
    我见过的不少 ORM 都有带版本管理的,会自动应用代码库里的 schema 变更。这些 migration 也可以手动升降。比如:
    https://docs.edgedb.com/get-started/migrations
    https://hexdocs.pm/ecto_sql/Ecto.Migration.html
    killva4624
        10
    killva4624  
       2024-08-12 10:33:20 +08:00
    SQL 文件也要版本化管理,V1.0 ~ V1.5 顺序执行,数据库已执行的 SQL 要有对应版本号信息(你甚至可以直接建一个表记录当前版本号)。
    基于这点的原则下去管理,GiT 也好、开源工具也好。
    nuistzhou
        11
    nuistzhou  
       2024-08-12 10:35:56 +08:00 via iPhone
    dbt ?
    NoobNoob030
        12
    NoobNoob030  
       2024-08-12 10:36:04 +08:00
    datagrip 表结构对比工具
    XiLingHost
        13
    XiLingHost  
       2024-08-12 10:43:13 +08:00
    不要让开发操作数据库,要改就在本地 dev 环境改,测试环境和生产环境一律使用 migration sql 脚本和 init 脚本跑数据库迁移/升级和初始化,这些脚本随自动构建产生的制品提供,比如在 docker 镜像里打包并在服务启动时执行,必须确保幂等性
    securityCoding
        14
    securityCoding  
       2024-08-12 10:49:15 +08:00
    ddl 也得放到发布单 checklist 里面接受 review
    leyfung
        15
    leyfung  
       2024-08-12 10:50:44 +08:00
    navicat 同步数据,表结构比较
    jaylee4869
        16
    jaylee4869  
       2024-08-12 10:51:40 +08:00
    flyway 原生 SQL 可以直接基于版本维护变更,同时支持多数语言 SDK
    yiqiao
        17
    yiqiao  
       2024-08-12 10:53:17 +08:00
    migration 迁移文件呀。别在测试服手动添加表和表字段。
    twofox
        18
    twofox  
       2024-08-12 10:54:13 +08:00
    liquibase 和 Flyway 不就是做这个事情的吗
    Rennen
        19
    Rennen  
       2024-08-12 10:56:54 +08:00
    在某司实习用的确实是三楼的方法
    另外还有发布时 checklist
    sampeng
        20
    sampeng  
       2024-08-12 11:12:22 +08:00
    现在几乎所有语言都有 migration 框架。。。
    之前招了一个哥们死活不同意用,嫌弃麻烦和脱裤子放屁,那就让他浪。三天两头上线忘记字段,然后。。然后就老实了
    wu67
        21
    wu67  
       2024-08-12 11:14:50 +08:00   ❤️ 1
    不要让开发直接改数据库. 让他写好 sql / script 后 找 运维/数据库管理员 执行操作.
    sunhelter
        22
    sunhelter  
       2024-08-12 11:25:54 +08:00
    CodeFirst 迁移结构至数据库,这不是 ORM 必须标配的功能嘛
    dododada
        23
    dododada  
       2024-08-12 11:34:02 +08:00
    3 楼就是标准方法,账号密码统一收口,所有操作界面化,日志化,可审计可追溯可回滚
    RandomJoke
        24
    RandomJoke  
       2024-08-12 11:53:03 +08:00
    既然你们已经通过 gitlab 管理了,说明你们可能没有专门的 DBA ,那不如直接 flyway 么,代码记录脚本,数据库记录执行情况
    BiChengfei
        25
    BiChengfei  
       2024-08-12 11:57:40 +08:00
    再给开发搭建一个开发环境啊。在测试改表,是因为本地项目只有接口,不好测试验证,测试环境有页面,点点点比较舒服
    说扣钱的我服了
    ilaipi
        26
    ilaipi  
       2024-08-12 11:58:54 +08:00
    这种情况就得老老实实写 migration
    Breacher
        27
    Breacher  
       2024-08-12 13:14:54 +08:00 via iPhone
    这个过程叫做 DB migration, 有很多工具可以做这个事情,比如 go-migrate, Flyway 等。将这件事情集成到 CD 就不会出现忘记加表或者字段了。
    liuhuansir
        28
    liuhuansir  
       2024-08-12 13:21:05 +08:00
    难道不是开发环境、测试环境、预发布环境、生产环境,四套么?开发环境,开发人员随便折腾,其他三个环境,开发没权限
    luozic
        29
    luozic  
       2024-08-12 13:41:44 +08:00
    三楼这种看起来不方便,但是你项目多,or 维护久了 就知道笨方法比瞎鸡儿整还节约时间,避免莫名其妙的问题
    luozic
        30
    luozic  
       2024-08-12 13:42:48 +08:00
    毕竟三楼这种时间是可以放入计划的,但是瞎整,查莫名其妙问题的时候,哪时间就完全拼人品
    6167
        31
    6167  
       2024-08-12 13:51:30 +08:00
    python, flask, flask-migrate 非常好用。可以同步表结构,upgrade 或 downgrade
    顺便点赞 20 楼,我隔壁也是这个死性子 @sampeng
    8355
        32
    8355  
       2024-08-12 14:06:00 +08:00
    预发布环境充分测试。。。
    这个问题跟通过什么方式能保证生产环境无 bug 一样,是人的问题。
    chendl111
        33
    chendl111  
       2024-08-12 14:16:15 +08:00
    不保证环境一致,有关键字段添加则通知生产方
    chendl111
        34
    chendl111  
       2024-08-12 14:17:48 +08:00
    @chendl111 #33 字段更新有专门的 OA 管理
    Vtwoguest
        35
    Vtwoguest  
       2024-08-12 15:05:11 +08:00 via iPhone
    >数据库里添加表、添加字段、添加了初始化的数据
    不好意思 大家加了表或者字段没有任何设计资料吗? Sql 设计书、性能测试书、表说明书、DDL 等等
    MangoFlavor
        36
    MangoFlavor  
       2024-08-12 15:07:55 +08:00
    这是人的问题,
    coderzhangsan
        37
    coderzhangsan  
       2024-08-12 15:32:01 +08:00
    楼主反馈的问题是部署流程管理的问题,流程执行和把关不严;有运维或 dba 的情况下,开发人员不要操作数据库,数据库不是代码,不适合做 CI/CD ,由专业人员操作比较合适,如果没有,那就是你们技术主管的职责,毕竟部署环节缺失字段,顶多是短时间影响业务,而数据库误操作那可能就要祭天了。
    mark2025
        38
    mark2025  
       2024-08-12 15:39:43 +08:00
    所有建表 DDL 纳入 git 版本管理
    任何表结构变动必须在版本管理中有提交记录
    dddd1919
        39
    dddd1919  
       2024-08-12 15:46:52 +08:00
    关键词:DDL 、DML
    搜索技术栈的具体实现,分别用来管理数据库结构变更和关键数据变更,保证各环境的数据一致
    除了工具,还要有完善的运作机制,保障公用的测试以及生产库变更全部走 DDL 或 DML
    lasuar
        40
    lasuar  
       2024-08-12 15:48:37 +08:00
    测试环境 没有必要和生产环境严格一致。测试环境存有单独用于测试的表或字段,上线的表结构改动添加到代码中就行了,比如建个目录 ddl_history 保存 20240808.sql ,如果连这个都忘记写,那就是人的问题了。
    litchinn
        41
    litchinn  
       2024-08-12 22:38:24 +08:00
    如果是大型项目应该收回开发对测试环境的操作权限,交给测试或运维,数据库改动提供脚本给测试或运维执行。
    小项目可以用一些自动化工具,java 系有 liquibase ,flyway 等。
    但是这些也是逃不开自己写脚本的。
    养成习惯,不要在 navicat 上直接改动数据库,改动时不要直接 Ctrl+s ,而且将那个 sql 预览复制出来执行
    qiyilai
        42
    qiyilai  
       2024-08-13 10:33:41 +08:00
    尝试过好多,最后只能用严格执行的规章流程来控制,全部修改都得有 sql 语句汇总到版本管理员
    runliuv
        43
    runliuv  
       2024-08-13 11:28:54 +08:00
    SQL 脚本 + SVN/GIT 。
    yinshaojun96
        44
    yinshaojun96  
       2024-08-13 19:21:10 +08:00
    @linjian 我们拿这个做测试生产数据同步,但是这玩意还能同步构建表么?
    linjian
        45
    linjian  
       2024-08-22 10:44:09 +08:00
    @yinshaojun96 可以建表 https://github.com/liquibase/liquibase 可以看下这个
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1632 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 16:24 · PVG 00:24 · LAX 09:24 · JFK 12:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.