← 05 命令语义 | 返回总览 | 下一篇:07 Spring Boot Starter
易用性是本项目的明确产品诉求。本篇定义配置体系与 CLI 的完整用户体验。
CLI 参数 > 环境变量 FLYDB_* > 配置文件 flydb.conf > 内置默认值
- 格式:Properties(JDK 内置解析,UTF-8 读取)。不用 YAML——flydb-core 承诺零第三方运行时依赖,引入 SnakeYAML 会打破承诺。若确有 YAML 需求,二期以
flydb-config-yaml可选模块提供、由 CLI 捆绑,不进 core。 - 环境变量映射:
flydb.url→FLYDB_URL;flydb.placeholders.foo→FLYDB_PLACEHOLDERS_FOO(.→_,全大写),机械规则无特例。 - 配置文件查找顺序:
--config显式指定 > 当前目录flydb.conf> CLI 安装目录conf/flydb.conf。 - 无效键报错:配置文件中出现无法识别的
flydb.*键 →FLYDB-4001报错(列出未知键与近似建议)。杜绝旧原型"配置了但没有任何代码使用"的静默失效。
| 配置键 | 环境变量 | CLI 选项 | 默认值 | 说明 |
|---|---|---|---|---|
flydb.url |
FLYDB_URL |
-u, --url |
无(必填) | JDBC URL |
flydb.user |
FLYDB_USER |
--user |
无 | |
flydb.password |
FLYDB_PASSWORD |
-p, --password |
无 | 支持 ${env:VAR} 间接引用(§3) |
flydb.driver |
FLYDB_DRIVER |
--driver |
按 URL 前缀推断 | 显式驱动类名 |
flydb.database-type |
FLYDB_DATABASE_TYPE |
--database-type |
自动探测 | 方言名(03 §1 逃生舱) |
flydb.locations |
FLYDB_LOCATIONS |
-l, --locations |
filesystem:db/migration(CLI)/ classpath:db/migration(API) |
逗号分隔多值;递归扫描子目录;filesystem: 支持相对或绝对路径,相对路径以 CLI 当前工作目录为基准 |
flydb.encoding |
FLYDB_ENCODING |
--encoding |
UTF-8 |
脚本编码 |
flydb.table |
FLYDB_TABLE |
--table |
flydb_schema_history |
历史表名 |
flydb.baseline-version |
FLYDB_BASELINE_VERSION |
--baseline-version |
1 |
|
flydb.baseline-on-migrate |
FLYDB_BASELINE_ON_MIGRATE |
--baseline-on-migrate |
false |
|
flydb.validate-on-migrate |
FLYDB_VALIDATE_ON_MIGRATE |
--validate-on-migrate |
true |
|
flydb.out-of-order |
FLYDB_OUT_OF_ORDER |
--out-of-order |
false |
|
flydb.target-version |
FLYDB_TARGET_VERSION |
--target-version |
无 | 精确执行版本;与范围互斥 |
flydb.start-version |
FLYDB_START_VERSION |
--start-version |
无 | 包含边界的起始版本 |
flydb.end-version |
FLYDB_END_VERSION |
--end-version |
无 | 包含边界;不含结束版本的族子版本(.N),需包含时用 family-range |
flydb.version-selection |
FLYDB_VERSION_SELECTION |
--version-selection |
自动推断 | exact|range|family|family-range|regex |
flydb.version-source |
FLYDB_VERSION_SOURCE |
--version-source |
file |
file|directory |
flydb.version-regex |
FLYDB_VERSION_REGEX |
--version-regex |
无 | 版本整串正则 |
flydb.directory/file/path-glob |
对应 FLYDB_*_GLOB |
对应 --*-glob |
无 | 相对路径发现过滤 |
flydb.directory/file/path-regex |
对应 FLYDB_*_REGEX |
对应 --*-regex |
无 | 相对路径整串正则过滤 |
flydb.migration-order |
FLYDB_MIGRATION_ORDER |
--migration-order |
version |
version|directory-version |
flydb.directory-version-regex |
FLYDB_DIRECTORY_VERSION_REGEX |
--directory-version-regex |
最近的数字目录 | version 命名组或第一个捕获组 |
flydb.placeholders.<k> |
FLYDB_PLACEHOLDERS_<K> |
-D<k>=<v> |
空 | 用户占位符 |
flydb.placeholder-replacement |
FLYDB_PLACEHOLDER_REPLACEMENT |
--placeholder-replacement |
true |
false 时 ${...} 业务模板原样保留 |
flydb.placeholder-prefix |
FLYDB_PLACEHOLDER_PREFIX |
--placeholder-prefix |
${ |
|
flydb.placeholder-suffix |
FLYDB_PLACEHOLDER_SUFFIX |
--placeholder-suffix |
} |
|
flydb.sql-migration-prefix |
FLYDB_SQL_MIGRATION_PREFIX |
--sql-migration-prefix |
V |
版本化迁移前缀 |
flydb.repeatable-migration-prefix |
FLYDB_REPEATABLE_MIGRATION_PREFIX |
--repeatable-migration-prefix |
R |
可重复迁移前缀 |
flydb.undo-migration-prefix |
FLYDB_UNDO_MIGRATION_PREFIX |
--undo-migration-prefix |
U |
撤销迁移前缀 |
flydb.sql-migration-separator |
FLYDB_SQL_MIGRATION_SEPARATOR |
--sql-migration-separator |
__ |
版本与描述分隔符 |
flydb.sql-migration-suffix |
FLYDB_SQL_MIGRATION_SUFFIX |
--sql-migration-suffix |
.sql |
脚本文件后缀 |
flydb.callbacks |
FLYDB_CALLBACKS |
--callbacks |
空 | Java 回调类名,逗号分隔 |
flydb.clean-disabled |
FLYDB_CLEAN_DISABLED |
--clean-disabled |
true |
防呆 |
flydb.lock-timeout-seconds |
FLYDB_LOCK_TIMEOUT_SECONDS |
--lock-timeout-seconds |
60 |
|
flydb.batch-size |
FLYDB_BATCH_SIZE |
--batch-size |
1 |
SQL 语句 JDBC 批大小;1 逐条执行并精确定位失败语句,>1 减少远程往返;批量失败按 EXECUTE_FAILED、遇错即停计数或批次范围分级定位,confirmed 只统计首个失败之前的连续成功前缀 |
- 配置文件明文:
flydb.password=明文密码——功能上支持,适合本地临时测试;不要提交到版本库或用于共享/生产环境。 - 环境变量间接引用:
flydb.password=${env:DB_PASSWORD}——配置装载时解析,密码本身不落盘、不进日志。 - 密码文件:
flydb.password.file=/run/secrets/db_password(K8s/容器 Secret 挂载场景)。 - 交互输入:CLI 检测到密码缺失且连接 TTY →
System.console().readPassword()遮罩读取;非 TTY 则报FLYDB-4002提示可用来源。 - 统一脱敏:日志、异常消息、
--dry-run输出中,密码一律****;URL 中的内嵌凭据(user:pass@host)同样脱敏。
flydb [全局选项] <命令> [命令选项]
命令:
migrate 执行待应用的迁移 info 查看迁移状态总表
validate 校验本地脚本与历史记录一致性 baseline 为存量库设置基准版本
repair 清除失败记录/对齐校验和 clean 清空目标 schema(默认禁用)
undo 撤销最近一次版本化迁移 init 初始化脚手架
version 输出 flydb 自身版本
全局选项:-c/--config <file>、-u/--url、--user、-p/--password、-l/--locations、版本选择/来源、路径 glob/regex、迁移排序、-X/--debug(完整堆栈)、-q/--quiet、--color=auto|always|never、-n/--dry-run、--json(机器输出契约,见设计 10)。完整名称以命令参考为准。
--dry-run(migrate/undo):完整执行探测/校验/解析/pending 计算,对每条将执行的语句只打印不执行——上线评审的刚需。- 版本选择(migrate):默认目标为精确文件版本;显式支持版本族、版本族范围、正则与目录版本来源。显式选择排除 repeatable,且继续服从校验和
out-of-order。 - 路径发现过滤:directory/file/path 三个维度取交集,同一维度 glob/regex 互斥;规则影响所有读取本地迁移的命令。
- 排序:只提供与版本历史语义一致的
version与directory-version,后者强制校验目录/文件版本族关系。 - 占位符总开关:
placeholder-replacement=false时真实迁移与 dry-run 都跳过替换,允许把${...}业务运行时模板原样写入数据库。 clean双保险:cleanDisabled=false之外,交互式终端还需输入目标库名确认;非交互需--force。- Ctrl+C:注册 shutdown hook 释放锁连接,退出码 5。
交互模式(TTY)依次询问 URL/用户名/驱动类名/数据库类型,生成:
./flydb.conf # 含中文注释与全部常用项示例
./db/migration/V1__init.sql # 示例迁移
./drivers/README.md # 各数据库驱动获取指引(Maven 坐标 + 官网下载页)
非交互:flydb init --url jdbc:dm://localhost:5236 --driver dm.jdbc.driver.DmDriver --database-type dm --yes。
其中 --driver 和 --database-type 会写入生成的 flydb.conf;标准 URL 的驱动类可留空自动推断,厂商 URL 应显式提供。
生成的 flydb.locations 使用 db/migration 的绝对路径;手工配置相对 filesystem: 路径时仍以 CLI 当前工作目录为基准。
flydb 0.2.1 · 达梦 DM8 · jdbc:dm://10.0.0.1:5236 · 历史表: flydb_schema_history
版本 描述 类型 已安装时间 耗时(ms) 状态
------- ---------------------- ----- ------------------- -------- --------
1 init SQL 2026-08-10 09:12:03 128 成功
2 add_status_column SQL 2026-08-11 10:03:41 45 成功
2.1 fix_status_default SQL - - 待执行
(可重复) user_summary_view SQL 2026-08-11 10:03:42 12 待更新
- 状态中文:
待执行/成功/失败/缺失/乱序/未来版本/待更新/基准/已撤销。 - TTY 着色(绿=成功、红=失败、黄=待执行、灰=缺失);非 TTY(管道/CI)自动降级纯文本;中文对齐按显示宽度(全角=2)计算,列宽按列内最宽内容自适应(含保底宽度),宽版本号(如
20260327-b06.4)不会挤歪后续列。
格式(所有 FlydbException 统一):
[FLYDB-3001] 获取迁移锁超时(Lock acquisition timed out)
可能原因: 另一个 flydb 进程正在对该数据库执行迁移;或前次迁移进程异常终止后数据库尚未释放连接。
建议操作: 使用 flydb info 查看锁持有者信息(locked_by/locked_at);确认无并发迁移后重试。
| 区段 | 含义 | 代表 |
|---|---|---|
FLYDB-1xxx |
连接与探测 | 1001 连接失败;1002 无法识别数据库类型;1003 驱动未找到(提示 drivers/ 用法) |
FLYDB-2xxx |
迁移与校验 | 2001 非法版本号;2002 重复版本;2003 checksum 不匹配;2004 存在失败记录需 repair;2005 旧式 R 前缀命名;2006 乱序迁移;2007 baseline 前置不满足;2008 缺少 undo 脚本;2009 未定义占位符;2010 迁移执行失败(先读执行快照,未知状态禁止自动重放) |
FLYDB-3xxx |
并发锁 | 3001 获取锁超时 |
FLYDB-4xxx |
配置 | 4001 未知配置键;4002 缺少必填项;4003 clean 被禁用;4004 init 目标文件已存在;4005 迁移位置不存在 |
退出码约定(写入文档,CI 按码分支:锁冲突可重试,校验失败需人工):
| 码 | 含义 |
|---|---|
| 0 | 成功 |
| 1 | 一般错误(连接失败、SQL 执行失败等) |
| 2 | 校验失败(validate / validateOnMigrate) |
| 3 | 并发锁冲突/超时 |
| 4 | 配置错误 |
| 5 | 用户中断(SIGINT) |
- CLI fat jar 不内置任何 JDBC 驱动:① 许可证隔离(MySQL Connector/J 为 GPL+FOSS 例外、OceanBase 客户端为 LGPL,与 flydb 的 Apache-2.0 分发解耦);② 信创现实(达梦/金仓驱动经企业内网制品库分发,不能假设可访问公网)。
DriverResolver依次检查<安装目录>/drivers/*.jar、运行时 classpath、Maven 本地仓库、~/.flydb/drivers缓存;仍未找到时读取 Maven settings 的 mirror、激活 Profile 仓库、server 认证和 proxy,并通过有效镜像解析 Central。mirrorOf=*存在时不得绕过私服。- 下载的 JAR 写入 Flydb 独立缓存,不修改 Maven 本地仓库;
flydb.offline=true或flydb.driver-download=never可禁止联网。CLI 仍然不捆绑任何 JDBC 驱动。 - 解析结果构建子 URLClassLoader;不走
DriverManager(对非系统类加载器加载的驱动有可见性限制),而是反射实例化java.sql.Driver后由内置DriverDataSource直接持有调用driver.connect(url, props)。 - 驱动类名按 URL 前缀内置映射(
jdbc:dm://→dm.jdbc.driver.DmDriver等),--driver可覆盖;映射表维护在DatabaseType各实现内。 - 二期外部方言 jar(01 §2.1)同样放
drivers/目录,一并进入 SPI 扫描路径。
flydb-cli-<版本>/
├── bin/flydb bin/flydb.bat # 启动脚本(检测 JAVA_HOME,要求 Java 8+)
├── lib/ # flydb-cli.jar + flydb-core.jar + picocli.jar
├── drivers/README.md # 驱动放置说明 + 坐标速查(01 §5)
├── conf/flydb.conf.sample
├── docs/ # 与发行版本匹配的命令、配置、错误码和数据库指南
├── flydb-skills/ # 可安装的 flydb-cli Agent Skill 与评测用例
├── AGENTS.md # Agent 首次接入、安全边界和 Skill 启用入口
├── LICENSE
├── NOTICE
├── README.en.md
└── README.md # 五分钟上手
zip 由 maven-assembly-plugin 产出,挂到 GitHub Releases;版本匹配的文档和 Skill 随包分发,Agent 在没有源码 checkout 时也能读取真实命令契约。bin/flydb 对 JDK 版本给出中文错误提示(低于 8 时)。
- README.md:定位一句话 → 支持数据库矩阵(真实状态,含"实验性"标注)→ 五分钟上手(CLI 三步 + API 一段代码,即 02 §1 示例)→ 指向 docs/。
docs/getting-started/:每个数据库一页(驱动获取、URL 格式、账号权限要求、已知限制)——信创用户拿到的第一手中文资料,是产品护城河的一部分。docs/reference/:配置项全表、错误码全表、命令手册。- 从 Flyway 迁移指南:历史表映射说明(
flyway_schema_history→flydb_schema_history的 baseline 接入路径)。