4. Flyway 支持的数据库:列表与驱动配置要点
Flyway 作为一款数据库迁移工具,其核心优势之一在于对主流关系型数据库的广泛支持。理解 Flyway 所支持的数据库列表以及各数据库驱动的配置要点,是进行跨环境迁移架构设计的基础。本章将系统梳理 Flyway 支持的数据库生态,并针对最常用的四种数据库(MySQL、PostgreSQL、Oracle、SQL Server)给出驱动配置的详细指南。
4.1 支持的数据库总览
Flyway 通过社区版和团队版(Teams/Enterprise)提供对不同数据库的支持。社区版覆盖了绝大多数开源和商业数据库,而团队版则增加了对更多商业数据库及高级特性的支持。下表列出了 Flyway 支持的主要数据库及其版本要求:
| 数据库 | 最低支持版本 | Flyway 版本要求 | 备注 |
|---|---|---|---|
| MySQL | 5.6 | 社区版 | 支持 MySQL 8.0+ 的窗口函数等新特性 |
| MariaDB | 10.2 | 社区版 | 与 MySQL 驱动兼容,推荐使用专用驱动 |
| PostgreSQL | 9.6 | 社区版 | 支持 PG 15+ 的逻辑复制槽等高级功能 |
| Oracle | 11g | 社区版 | 需手动下载 ojdbc 驱动,注意许可证 |
| SQL Server | 2012 | 社区版 | 支持 Azure SQL Database 和 SQL Server 2019+ |
| DB2 | 10.5 | 团队版 | 需要 IBM 官方 JDBC 驱动 |
| SQLite | 3.25 | 社区版 | 仅用于开发/测试,不支持并发写 |
| H2 | 2.1 | 社区版 | 常用于单元测试和嵌入式场景 |
| Redshift | 1.0 | 团队版 | 基于 PostgreSQL 协议,但功能受限 |
| Snowflake | 6.0 | 团队版 | 云原生数仓,需专用驱动 |
4.2 数据库驱动配置要点
Flyway 通过 JDBC 驱动与数据库通信。正确配置驱动是迁移成功的第一步。以下针对四种主流数据库,分别说明驱动下载、类名、连接 URL 格式及常见配置陷阱。
4.2.1 MySQL / MariaDB
MySQL 驱动配置相对简单,但需注意驱动版本与数据库版本的兼容性。从 MySQL 8.0 开始,官方推荐使用 com.mysql.cj.jdbc.Driver。
- 驱动 JAR:
mysql-connector-java(或mysql-connector-j) - 驱动类名:
com.mysql.cj.jdbc.Driver - 连接 URL 格式:
jdbc:mysql://<host>:<port>/<database>?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
- 配置要点:
useSSL=false:开发环境建议关闭 SSL 以减少延迟;生产环境应启用并配置证书。allowPublicKeyRetrieval=true:MySQL 8.0+ 默认使用 caching_sha2_password 插件,需显式允许公钥检索。serverTimezone=UTC:避免时区转换导致的日期错误。- Flyway 配置示例(
flyway.conf):
flyway.url=jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC
flyway.user=root
flyway.password=secret
flyway.driver=com.mysql.cj.jdbc.Driver
4.2.2 PostgreSQL
PostgreSQL 驱动(org.postgresql.Driver)是 Flyway 社区版中兼容性最好的驱动之一,支持几乎所有 PostgreSQL 特性。
- 驱动 JAR:
postgresql(或postgresql-jdbc) - 驱动类名:
org.postgresql.Driver - 连接 URL 格式:
jdbc:postgresql://<host>:<port>/<database>?currentSchema=public&ApplicationName=Flyway
- 配置要点:
currentSchema:指定默认 schema,避免迁移脚本中频繁使用 schema 前缀。ApplicationName:设置应用名称,便于在数据库监控中识别 Flyway 连接。- PostgreSQL 支持
PGPASSWORD环境变量,但 Flyway 配置中仍建议使用flyway.password。 - Flyway 配置示例:
flyway.url=jdbc:postgresql://localhost:5432/mydb?currentSchema=app_schema
flyway.user=app_user
flyway.password=app_pass
flyway.driver=org.postgresql.Driver
4.2.3 Oracle
Oracle 驱动配置相对复杂,主要因为 Oracle JDBC 驱动(ojdbc)的版本选择与许可证问题。Flyway 社区版支持 Oracle 11g 及以上版本。
- 驱动 JAR:
ojdbc8(对应 Oracle 12c/19c)或ojdbc10(对应 Oracle 21c+) - 驱动类名:
oracle.jdbc.OracleDriver - 连接 URL 格式:
jdbc:oracle:thin:@//<host>:<port>/<service_name>
- 配置要点:
- 使用 Thin 驱动(
@//格式),避免使用 OCI 驱动(需要安装 Oracle 客户端)。 - Oracle 12c+ 引入了 CDB/PDB 架构,连接 URL 中的
service_name应指向 PDB 服务名。 - 驱动 JAR 需手动下载并放置在 Flyway 的
drivers目录下,或通过 Maven/Gradle 依赖管理。 - Flyway 配置示例:
- 使用 Thin 驱动(
flyway.url=jdbc:oracle:thin:@//oracle-host:1521/ORCLPDB1
flyway.user=flyway_user
flyway.password=flyway_pass
flyway.driver=oracle.jdbc.OracleDriver
4.2.4 SQL Server
SQL Server 驱动配置需注意驱动版本与 SQL Server 版本的匹配。Microsoft 官方提供了 mssql-jdbc 驱动,支持 SQL Server 2012 至 2022 以及 Azure SQL Database。
- 驱动 JAR:
mssql-jdbc - 驱动类名:
com.microsoft.sqlserver.jdbc.SQLServerDriver - 连接 URL 格式:
jdbc:sqlserver://<host>:<port>;databaseName=<database>;encrypt=true;trustServerCertificate=false
- 配置要点:
encrypt=true:生产环境建议启用 TLS 加密;开发环境可设为false。trustServerCertificate=false:生产环境应验证服务器证书;开发环境可设为true以跳过验证。- SQL Server 支持 Windows 集成身份验证,但 Flyway 通常使用 SQL Server 身份验证(用户名/密码)。
- Flyway 配置示例:
flyway.url=jdbc:sqlserver://localhost:1433;databaseName=mydb;encrypt=false
flyway.user=sa
flyway.password=Strong!Pass
flyway.driver=com.microsoft.sqlserver.jdbc.SQLServerDriver
4.3 驱动配置架构图
下图展示了 Flyway 与四种主流数据库之间的驱动连接架构,以及各驱动在迁移流程中的位置:
4.4 驱动配置常见问题与避坑指南
在实际项目中,驱动配置错误是导致 Flyway 迁移失败的最常见原因之一。以下列出各数据库驱动配置的典型问题及解决方案:
- Public Key Retrieval 错误: 报错
Public Key Retrieval is not allowed。解决方案:在连接 URL 中添加allowPublicKeyRetrieval=true。 - SSL 连接超时: 开发环境建议设置
useSSL=false,或配置正确的 SSL 证书。 - 时区异常: 报错
The server time zone value 'XXX' is unrecognized。解决方案:设置serverTimezone=UTC或Asia/Shanghai。
- Schema 未找到: 迁移脚本中引用了不存在的 schema。解决方案:在连接 URL 中设置
currentSchema,或使用flyway.schemas配置项。 - 密码包含特殊字符: 密码中的
@、:、/等字符需进行 URL 编码(如%40代替@)。 - 连接池耗尽: 高并发迁移时,确保 PostgreSQL 的
max_connections参数足够。
- 驱动版本不匹配: 使用
ojdbc8连接 Oracle 11g 可能导致兼容性问题。建议根据 Oracle 版本选择对应驱动。 - 服务名错误: 使用 SID 格式(
jdbc:oracle:thin:@host:port:SID)而非服务名格式,导致连接失败。推荐使用服务名格式@//host:port/service_name。 - 权限不足: Flyway 用户需要
CREATE SESSION、CREATE TABLE、CREATE SEQUENCE等权限。
- TLS 握手失败: 低版本 SQL Server 不支持 TLS 1.2。解决方案:设置
encrypt=false或升级 SQL Server。 - 集成身份验证配置复杂: 使用 SQL Server 身份验证(用户名/密码)可简化配置。
- 数据库名称大小写敏感: SQL Server 默认不区分大小写,但 Azure SQL Database 可能区分。建议统一使用小写。
4.5 驱动配置最佳实践
基于上述配置要点和常见问题,总结以下驱动配置的最佳实践:
- 统一驱动版本: 在团队中统一使用相同版本的 JDBC 驱动,避免因驱动版本差异导致的兼容性问题。
- 使用连接池(可选): 对于高并发迁移场景,可考虑使用 HikariCP 等连接池管理 JDBC 连接,但需注意 Flyway 默认使用自己的连接管理。
- 配置外部化: 将数据库连接信息(URL、用户名、密码)放在环境变量或配置中心,避免硬编码在 Flyway 配置文件中。
- 测试驱动配置: 在 CI/CD 流水线中增加驱动连接测试步骤,确保迁移前数据库可达。
- 记录驱动日志: 启用 Flyway 的调试日志(
flyway.log=debug),便于排查驱动连接问题。