主题
Flyway 数据库迁移接管与发布规范
1. 目标与边界
Flyway 只负责版本化、可审计的数据库结构变更和确定性基础数据。
- Web 应用不依赖 Flyway,普通启动和服务器重启不会修改数据库。
ruoyi-migration.jar是唯一迁移执行入口。- 新迁移只允许放在
Api/ruoyi-system/src/main/resources/db/migration。 - 接管前脚本归档在
Api/ruoyi-system/src/main/resources/db/legacy-migration,不再修改。 - 临时修数、故障补偿和批量删除不进入 Flyway。
- Flyway
clean、baseline-on-migrate和乱序执行均被禁用。
当前首批受管迁移为:
text
V20260818_001__merchant_entry_notice.sql
V20260818_002__merchant_penalty_appeal_history.sql2. 版本与 SQL 规则
文件名必须使用:
text
VyyyyMMdd_NNN__lower_snake_case.sql同一日期的 NNN 从 001 递增。迁移一旦提交或在任一共享环境执行,禁止修改、重命名或删除;修正必须创建更高版本。
蓝绿发布共用一个数据库,因此迁移必须遵守 expand-contract:
- 先新增兼容列、表或索引,新旧代码都能运行。
- 新代码完成切流并稳定运行后,再停止旧结构写入。
- 删除旧列、旧表等收缩操作必须放到后续独立版本。
3. 构建与本地命令
构建迁移工具:
bash
cd Api
mvn -pl ruoyi-migration package迁移工具只从环境变量读取连接信息,密码不会进入命令行参数:
bash
export FLYWAY_URL='jdbc:mysql://127.0.0.1:3306/xiedao_dev?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8'
export FLYWAY_USER='xiedao'
export FLYWAY_PASSWORD='数据库密码'
java -jar ruoyi-migration.jar info
java -jar ruoyi-migration.jar validate
java -jar ruoyi-migration.jar migratebaseline 必须显式携带经审核的版本,例如:
bash
java -jar ruoyi-migration.jar baseline 202608174. 首次接管前置审计
候选基线版本是 20260817,因为现有人工迁移归档的最高版本为 V20260817。它不是可以直接执行的默认值,只有确认数据库已包含全部历史变更后才能使用。
分别对 xiedao_dev 和 xiedao_prod 完成以下检查:
- 使用
mysqldump --no-data --skip-comments --skip-dump-date导出结构并进行差异比较。 - 核对部署记录中的历史遗漏,尤其是
xd_rental_order_dispatch和xd_car_rental_dispatch的is_overdue、overdue_days、overdue_fee_fen字段。 - 核对当前应用 Mapper 引用的表和列均存在。
- 确认库中没有
flyway_schema_history;如果存在,先查清来源,禁止覆盖。 - 在执行 baseline 前创建全库备份及 SHA-256 文件。
只要开发库和正式库仍有未解释的结构差异,就停止接管。Flyway baseline 只登记历史起点,不会验证历史脚本是否真的执行过。
5. 一次性接管顺序
5.1 开发库
- 构建
ruoyi-migration.jar,上传到服务器的受限目录。 - 配置指向
xiedao_dev的FLYWAY_URL/USER/PASSWORD。 - 执行
info,确认没有历史表。 - 执行
baseline 20260817。 - 执行
migrate和validate,确认两个V20260818迁移成功。 - 在
/opt/xiedao/dev/env.sh增加:
bash
export FLYWAY_DEPLOY_ENABLED=true可选连接覆盖项:
bash
export FLYWAY_HOST=127.0.0.1
export FLYWAY_PORT=3306
export FLYWAY_DATABASE=xiedao_dev
export FLYWAY_USER=xiedao未设置 FLYWAY_PASSWORD 时,发布脚本复用现有 DB_PASSWORD。
5.2 正式库
- 完成开发库迁移和业务验收。
- 对
xiedao_prod创建完整备份并计算 SHA-256。 - 使用同一个
ruoyi-migration.jar执行baseline 20260817。 - 执行
migrate和validate。 - 在蓝、绿两个
/opt/xiedao/prod/<slot>/env.sh中增加FLYWAY_DEPLOY_ENABLED=true。 - 两个槽位必须使用一致的 Flyway 主机、端口、库名和账号配置。
不要通过启动 Web 服务完成首次 baseline。
6. 发布行为
开发发布产物包含:
ruoyi-admin.jarruoyi-migration.jar- 同时记录两个 SHA-256 的
release.env
开发环境开启迁移门禁后,发布顺序是:校验两个 JAR、Flyway validate、Flyway migrate、切换 Web JAR、健康检查。迁移未执行的 release 会记录 MIGRATIONS_PASSED=false,禁止晋级生产。
生产晋级仍在 /opt/xiedao/prod/operation.lock 内串行执行,顺序是:
- 校验开发 release、Git 状态、测试结果及两个 JAR 的 SHA-256。
- 使用
mysqldump --single-transaction创建压缩备份和 SHA-256 文件。 - 执行 Flyway
validate和migrate。 - 切换非流量槽位的 Web JAR并重启、健康检查。
- Nginx 切流仍由原有
switch-prod独立完成。
若数据库迁移成功但新应用启动失败,只回滚应用 JAR,数据库不会自动回滚。因此每条生产迁移都必须与旧应用向后兼容。
7. 自动化验证
bash
cd Api
mvn -pl ruoyi-migration test测试包括:
- 迁移文件命名和重复版本检查。
- 使用 MySQL 8.0 Testcontainers 建立历史库、baseline 到
20260817、执行正式迁移并 validate。
本机没有 Docker 时容器测试会跳过;CI 或发布前验证环境必须提供 Docker,并确认该测试实际执行而不是跳过。