面向需要用 Flydb CLI 同时管理多个数据库家族、多套测试与生产环境的开发和运维人员。Flydb 0.2 没有内置的环境 profile 机制,本文给出一套完全基于现有 CLI 契约的组织模式:一个数据库×环境一份 flydb.conf,密码全部外部注入,所有环境执行同一套命令序列。配置键、命令参数和错误码以配置项参考、CLI 命令参考和错误码参考为准,本文不重复维护。
多环境自动化由三块现有能力拼出:
| 能力 | 作用 |
|---|---|
-c, --config <file> |
为每个数据库×环境绑定一份独立配置 |
FLYDB_* 环境变量 |
优先级高于 flydb.conf,用于注入密码等环境差异 |
| 稳定退出码 | CI 按校验失败、锁冲突、配置错误等类别分流处理 |
配置优先级统一为 CLI 参数 > FLYDB_* 环境变量 > flydb.conf > 内置默认值。
按 <数据库>.<环境> 命名,集中放在迁移仓库的 deploy/ 目录并纳入版本控制:
deploy/
├── flydb.mysql.uat.conf
├── flydb.mysql.prod.conf
├── flydb.dm.uat.conf
└── flydb.dm.prod.conf
示例(只放非敏感项,密码一律不进文件):
flydb.url=jdbc:mysql://db-uat.example.com:3306/app
flydb.user=flydb_ddl
flydb.database-type=mysql
flydb.locations=filesystem:/opt/deploy/migrations/mysql要点:
- 自动化中永远显式传
-c/--config。 不传时 CLI 按"当前目录flydb.conf→ 安装目录conf/flydb.conf"隐式查找,而 CI 和堡垒机的工作目录不可控,隐式查找是配置漂移的主要来源;隐式查找只适合本地交互使用。 flydb.locations写绝对路径。filesystem:相对路径以执行 CLI 时的工作目录为基准;init生成的配置同样使用绝对路径。- 未知
flydb.*键直接报FLYDB-4001,配置文件因此天然是一份可校验的环境清单:拼错键名会在流水线最早一步失败,而不是静默生效。 - SQL 占位符按环境差异化取值时,在各环境 conf 中写
flydb.placeholders.<key>,或由流水线统一用-D<key>=<value>传入;业务运行时模板要原样入库时设置flydb.placeholder-replacement=false。 - 环境细节不能进版本库时,可退化为"一份
flydb.conf+ 每环境一组FLYDB_URL、FLYDB_USER、FLYDB_LOCATIONS环境变量";可评审性不如每环境一个文件。
| 环境 | 推荐方式 | 说明 |
|---|---|---|
| 本地临时测试 | flydb.password 明文 |
仅限本地,不要提交 |
| 测试 / CI | FLYDB_PASSWORD 或 flydb.password=${env:DB_PASSWORD} |
由 CI secret 系统注入 |
| 生产 / 共享 | flydb.password.file=/run/secrets/db_password |
由 Vault、KMS 或部署系统落盘,收紧文件权限 |
- 自动化中不要使用
-p/--password:命令行参数会进入进程列表、shell history 和 CI 日志。 - 每个环境使用独立的专用 DDL 账号,迁移账号与业务账号分离;Spring Boot 应用按配置项参考用
flydb.url/user/password做同样的隔离。
migrations/
├── mysql/ V1__init.sql V2__add_order.sql
├── dm/ V1__init.sql V2__init_data.sql
└── oracle/ V1__init.sql
每个 conf 的 flydb.locations 指向自己家族的顶层目录。各数据库的版本流互相独立,历史表位于各自的目标库,天然隔离,这是推荐做法。
- 同一数据库内多个应用共用 schema 时,用
flydb.table区分历史表。 directory-glob/path-glob等路径过滤也能在同一 locations 下切分子集,但过滤会影响info、validate、repair、undo看到的全部本地集合;能用分 locations 解决就不要用过滤。过滤规则见配置项参考。- 调整脚本目录期间,把新旧 locations 逗号并列过渡,避免已应用记录变
MISSING报FLYDB-2003,详见迁移位置与已有历史。
CONF=deploy/flydb.dm.prod.conf
bin/flydb -c "$CONF" version # 各环境工具版本一致性检查
bin/flydb -c "$CONF" validate # checksum、失败记录、迁移集合
bin/flydb -c "$CONF" --dry-run migrate # 输出待执行清单,供人工或门禁核对
# ── 生产环境在此设置审批门:核对 dry-run 清单与目标库摘要,获得明确授权后 ──
bin/flydb -c "$CONF" migrate
bin/flydb -c "$CONF" info --color=never # 状态留档
bin/flydb -c "$CONF" validate # 迁移后复核- 环境晋升就是换一个
-c。 测试与生产使用同一份脚本产物、同一个发行包 ZIP,只替换 conf 路径。各环境统一锁定同一个 Flydb 版本,流水线开头的version即检查点;发行包自带版本匹配的docs/与 Skill。 - 退出码做门禁:按错误码参考分类处理——
2校验失败直接阻断,3锁冲突可配置自动重试与告警(flydb.lock-timeout-seconds按最长迁移时长设置),4配置错误回退到配置阶段修复。 - 迁移只能有一个执行者。 要么 CI 统一执行 CLI,要么应用启动时由 Spring Boot starter 执行;两边都跑虽然会被迁移锁串行,但结果依赖时序。常见分工是测试环境用 starter 省事、生产走 CI 加审批,生产应用可用
flydb.enabled=false关闭自动迁移。 - 远程库大批量数据迁移用
--batch-size提速,MySQL 家族同时在 URL 上加rewriteBatchedStatements=true,见配置项参考。 - 可选:对生产定时执行只读
validate,checksum 不一致通常意味着有人绕过工具手工修改脚本,可作为漂移告警。
已有历史的生产库接入前,先人工对账已应用到的版本,写入基线后再交给流水线:
bin/flydb -c "$CONF" baseline --baseline-version 20260801非空库首次接入也可以在 conf 中设置 flydb.baseline-on-migrate=true;两种方式都应先在测试环境演练。迁移失败留下的失败记录会阻断后续 migrate(FLYDB-2004);不要在流水线里自动 repair——它修改历史表,必须先由人确认修复策略。
- CI runner 与生产执行机的镜像中预置安装目录
drivers/,或把厂商驱动发布到企业私服,conf 写flydb.driver-coordinate并用--maven-settings指向私服 settings;解析顺序与私服语义见JDBC 驱动自动解析。 - 网络受限的生产执行机设置
flydb.offline=true,禁止一切远程驱动解析。 - 达梦、KingbaseES、openGauss 的驱动需写完整坐标;驱动解析不处理 Maven 传递依赖,需要伴随 JAR 的厂商驱动应把所有 JAR 一并放入
drivers/。CI 可缓存~/.flydb/drivers减少下载。 - 遵守厂商许可,不重新分发驱动 JAR。
- 没有
--json机器输出(规划于路线图阶段二):CI 目前只能依赖退出码和info --color=never的文本输出,解析逻辑需要接受这一约束,见路线图。 - 没有配置继承或模板:多份 conf 之间的重复内容,可在流水线中用模板生成后作为制品管理,而不是等待工具内置 profile。
undo只回退最近一次版本化迁移,clean是破坏性操作(默认禁用,非交互需双开关):两者都不应出现在自动化脚本中,仅在本地排障时人工执行。- 信创数据库的验证层级以数据库上手指南为准:达梦、KingbaseES、openGauss 目前为方言与驱动元数据契约测试,接入生产前应先在授权实例完成JDBC 数据库快速接入中的最小验证清单,不要把单测通过当作厂商兼容证明。
相关页面:数据库上手指南索引、JDBC 数据库快速接入、配置项参考、CLI 命令参考、错误码参考。