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

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

  •  
  •   yiyiniu · Aug 12, 2024 · 5832 views
    This topic created in 815 days ago, the information mentioned may be changed or developed.

    场景描述

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

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

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

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

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

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