3. Flyway 安装与配置:命令行工具、Maven/Gradle 插件、Spring Boot 集成配置

Flyway 的安装与配置是数据库迁移工作的起点。根据团队技术栈和部署环境的不同,Flyway 提供了三种主流集成方式:命令行工具(适合 CI/CD 与运维)、构建工具插件(Maven/Gradle,适合开发与构建阶段)以及 Spring Boot 自动配置(适合微服务与 Java 应用)。本章将逐一讲解每种方式的安装步骤、核心配置项及最佳实践。

3.1 命令行工具安装与配置

Flyway 命令行工具是一个独立的可执行程序,不依赖 Java 开发环境(仅需 JRE),非常适合在 Docker 容器、Jenkins Pipeline 或 Shell 脚本中执行迁移。

3.1.1 下载与安装

  • 下载地址:https://flywaydb.org/download(社区版免费)
  • 安装步骤:
    1. 下载对应操作系统(Windows/Linux/macOS)的压缩包。
    2. 解压至目标目录,例如 /opt/flyway 或 C:\flyway。
    3. 将 <flyway-home>/bin 添加到系统 PATH 环境变量。
    4. 验证安装:执行 flyway -v,应输出版本号。

3.1.2 核心配置文件:flyway.conf

命令行工具通过 conf/flyway.conf 文件配置数据库连接与行为。以下是一个典型配置示例:

# flyway.conf
flyway.url=jdbc:postgresql://localhost:5432/mydb
flyway.user=db_user
flyway.password=db_pass
flyway.locations=filesystem:./sql/migrations
flyway.baselineOnMigrate=true
flyway.encoding=UTF-8
flyway.cleanDisabled=true
配置项 说明 必填
flyway.url 数据库 JDBC 连接 URL 是
flyway.user 数据库用户名 是
flyway.password 数据库密码 是
flyway.locations 迁移脚本存放路径(支持 filesystem: 或 classpath:) 否(默认 filesystem:./sql)
flyway.baselineOnMigrate 对非空数据库是否自动基线化 否(默认 false)
flyway.cleanDisabled 禁止执行 flyway clean(生产环境建议 true) 否(默认 false)
安全提示:生产环境切勿将密码明文写入配置文件。推荐使用环境变量 FLYWAY_PASSWORD 或集成密钥管理服务(如 Vault)。

3.1.3 常用命令速查

  • flyway migrate — 执行待处理的迁移脚本。
  • flyway info — 查看迁移状态与版本历史。
  • flyway baseline — 对已有数据库建立基线版本。
  • flyway validate — 校验已应用脚本是否被篡改。
  • flyway repair — 修复迁移记录表(如删除失败的迁移条目)。
Flyway 命令行工具迁移流程 Flyway CLI 迁移执行流程 flyway.conf V1__init.sql flyway migrate 目标数据库 flyway_schema_history CLI 读取配置文件 → 解析迁移脚本 → 执行 SQL → 记录版本到 flyway_schema_history

3.2 Maven 插件集成

对于基于 Maven 构建的 Java 项目,Flyway Maven 插件可以将数据库迁移无缝集成到构建生命周期中,实现 mvn compile 时自动执行迁移。

3.2.1 插件配置

在 pom.xml 的 <build><plugins> 中添加:

<plugin>
    <groupId>org.flywaydb</groupId>
    <artifactId>flyway-maven-plugin</artifactId>
    <version>9.22.3</version>
    <configuration>
        <url>jdbc:mysql://localhost:3306/mydb</url>
        <user>${db.user}</user>
        <password>${db.password}</password>
        <locations>
            <location>classpath:db/migration</location>
        </locations>
        <baselineOnMigrate>true</baselineOnMigrate>
    </configuration>
</plugin>

3.2.2 常用 Maven 命令

命令 说明
mvn flyway:migrate 执行迁移
mvn flyway:info 查看迁移状态
mvn flyway:baseline 建立基线
mvn flyway:clean 清空数据库(慎用)
mvn flyway:validate 校验脚本完整性
最佳实践:将数据库连接信息通过 Maven Profile 或环境变量注入,避免硬编码。例如 -Ddb.user=dev_user -Ddb.password=dev_pass。

3.3 Gradle 插件集成

Gradle 插件的配置方式与 Maven 类似,但更简洁,适合 Kotlin/Groovy 构建脚本。

3.3.1 插件配置(build.gradle)

plugins {
    id 'org.flywaydb.flyway' version '9.22.3'
}

flyway {
    url = 'jdbc:postgresql://localhost:5432/mydb'
    user = 'db_user'
    password = 'db_pass'
    locations = ['classpath:db/migration']
    baselineOnMigrate = true
}

3.3.2 常用 Gradle 任务

  • gradle flywayMigrate
  • gradle flywayInfo
  • gradle flywayBaseline
  • gradle flywayValidate
注意:Gradle 插件默认不会自动绑定到 build 生命周期。如需在编译时自动迁移,需显式配置任务依赖:compileJava.dependsOn flywayMigrate。

3.4 Spring Boot 自动配置集成

Spring Boot 对 Flyway 提供了开箱即用的自动配置,只需引入依赖并配置 application.yml 即可。

3.4.1 添加依赖

<!-- Maven -->
<dependency>
    <groupId>org.flywaydb</groupId>
    <artifactId>flyway-core</artifactId>
</dependency>
<!-- 数据库驱动(以 PostgreSQL 为例) -->
<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <scope>runtime</scope>
</dependency>

3.4.2 配置文件(application.yml)

spring:
  datasource:
    url: jdbc:postgresql://localhost:5432/mydb
    username: db_user
    password: db_pass
  flyway:
    enabled: true
    locations: classpath:db/migration
    baseline-on-migrate: true
    clean-disabled: true
    encoding: UTF-8

3.4.3 关键配置项说明

配置项 默认值 说明
spring.flyway.enabled true 是否启用 Flyway 自动迁移
spring.flyway.locations classpath:db/migration 迁移脚本路径
spring.flyway.baseline-on-migrate false 对已有数据库自动基线化
spring.flyway.clean-disabled false 禁止 clean 操作(生产建议 true)
spring.flyway.out-of-order false 允许乱序迁移(多分支开发时使用)
Spring Boot 优势:应用启动时自动执行迁移,无需额外命令。配合 @FlywayDataSource 可支持多数据源场景。
Flyway 三种集成方式架构对比 Flyway 三种集成方式架构对比 命令行工具 (CLI) flyway.conf SQL 迁移脚本 flyway migrate 命令 目标数据库 Maven/Gradle 插件 pom.xml / build.gradle classpath:db/migration mvn flyway:migrate 目标数据库 Spring Boot 集成 application.yml classpath:db/migration @AutoConfigure 目标数据库 CLI 适合运维与 CI/CD;Maven/Gradle 适合开发构建;Spring Boot 适合微服务自动迁移

3.5 配置优先级与最佳实践

Flyway 支持多种配置来源,优先级从高到低为:命令行参数 > 环境变量 > 配置文件 > 默认值。合理利用这一机制可以避免敏感信息泄露。

3.5.1 环境变量覆盖示例

# Linux/macOS
export FLYWAY_URL="jdbc:postgresql://prod-db:5432/proddb"
export FLYWAY_USER="prod_user"
export FLYWAY_PASSWORD="prod_pass"

# Windows PowerShell
$env:FLYWAY_URL="jdbc:postgresql://prod-db:5432/proddb"

3.5.2 多环境配置策略

环境 推荐集成方式 配置来源
本地开发 Maven/Gradle 插件 pom.xml / build.gradle + 本地 profile
CI/CD 流水线 命令行工具 环境变量 + CI 密钥管理
生产环境 Spring Boot 自动配置 application-prod.yml + 外部配置中心
核心原则:
• 脚本路径统一使用 classpath:db/migration(Java 项目)或 filesystem:./sql/migrations(非 Java 项目)。
• 生产环境务必设置 cleanDisabled=true,防止误操作清空数据库。
• 使用 baselineOnMigrate=true 避免对已有数据库手动基线化。