4. Liquibase 支持的数据库
Liquibase 通过 JDBC 驱动与多种主流关系型数据库集成。本章列出官方支持的数据库清单、对应的 Maven/Gradle 驱动坐标以及标准的 JDBC 连接串格式,帮助你在环境配置阶段快速完成驱动引入与连接验证。
版本提示:以下信息基于 Liquibase 4.x 系列。部分数据库(如 CockroachDB、MariaDB)通过兼容层支持,驱动版本建议与数据库服务端大版本匹配。
4.1 支持的数据库总览
Liquibase 官方测试矩阵覆盖以下数据库。生产环境建议优先选择“完全支持”的数据库,社区扩展数据库需额外验证。
| 数据库 | 支持级别 | 最小驱动版本 | JDBC 驱动类 |
|---|---|---|---|
| Oracle | 完全支持 | ojdbc8 19.3+ | oracle.jdbc.OracleDriver |
| MySQL | 完全支持 | mysql-connector-j 8.0.33+ | com.mysql.cj.jdbc.Driver |
| PostgreSQL | 完全支持 | postgresql 42.5+ | org.postgresql.Driver |
| Microsoft SQL Server | 完全支持 | mssql-jdbc 11.2+ | com.microsoft.sqlserver.jdbc.SQLServerDriver |
| MariaDB | 完全支持 | mariadb-java-client 3.1+ | org.mariadb.jdbc.Driver |
| DB2 LUW | 完全支持 | db2jcc4 11.5+ | com.ibm.db2.jcc.DB2Driver |
| H2 | 完全支持(内存/文件) | h2 2.1+ | org.h2.Driver |
| SQLite | 社区扩展 | sqlite-jdbc 3.40+ | org.sqlite.JDBC |
| CockroachDB | 社区扩展(PostgreSQL 协议) | postgresql 42.5+ | org.postgresql.Driver |
| Snowflake | 社区扩展 | snowflake-jdbc 3.13+ | net.snowflake.client.jdbc.SnowflakeDriver |
驱动版本陷阱:MySQL 8.0 以上必须使用
com.mysql.cj.jdbc.Driver,旧版 com.mysql.jdbc.Driver 已被标记为过时。PostgreSQL 42.x 系列已移除对 TLS 1.0/1.1 的支持,若数据库端未升级 TLS 版本,连接会失败。
4.2 各数据库驱动配置
以下给出 Maven 和 Gradle 两种构建工具的依赖声明。如果你使用 Liquibase Maven 插件或 Gradle 插件,驱动依赖会自动加入类路径。
4.2.1 Maven 依赖示例
<!-- Oracle -->
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>19.21.0.0</version>
</dependency>
<!-- MySQL -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.33</version>
</dependency>
<!-- PostgreSQL -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.6.0</version>
</dependency>
<!-- Microsoft SQL Server -->
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>12.4.2.jre11</version>
</dependency>
<!-- H2 (内存数据库,常用于测试) -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>2.2.224</version>
<scope>test</scope>
</dependency>
4.2.2 Gradle 依赖示例
// Oracle
implementation 'com.oracle.database.jdbc:ojdbc8:19.21.0.0'
// MySQL
implementation 'com.mysql:mysql-connector-j:8.0.33'
// PostgreSQL
implementation 'org.postgresql:postgresql:42.6.0'
// SQL Server
implementation 'com.microsoft.sqlserver:mssql-jdbc:12.4.2.jre11'
// H2 (test scope)
testImplementation 'com.h2database:h2:2.2.224'
4.3 JDBC 连接串格式
JDBC URL 是 Liquibase 连接数据库的核心参数,格式错误会导致连接失败。以下列出各数据库的标准连接串模板及关键参数说明。
| 数据库 | JDBC 连接串模板 | 关键参数 |
|---|---|---|
| Oracle | jdbc:oracle:thin:@//host:1521/service_name |
使用服务名而非 SID;推荐启用 oracle.jdbc.timezoneAsRegion=false |
| MySQL | jdbc:mysql://host:3306/dbname?useSSL=false&allowPublicKeyRetrieval=true |
8.0+ 必须显式设置 useSSL 和 allowPublicKeyRetrieval |
| PostgreSQL | jdbc:postgresql://host:5432/dbname?currentSchema=public |
currentSchema 控制 Liquibase 默认操作的 schema |
| SQL Server | jdbc:sqlserver://host:1433;databaseName=dbname;encrypt=true;trustServerCertificate=true |
分号分隔参数;encrypt 和 trustServerCertificate 控制 TLS |
| MariaDB | jdbc:mariadb://host:3306/dbname?useSSL=false |
驱动类为 org.mariadb.jdbc.Driver,与 MySQL 驱动不同 |
| DB2 | jdbc:db2://host:50000/dbname:currentSchema=MYSCHEMA; |
参数使用冒号分隔;schema 大小写敏感 |
| H2 | jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1 |
内存模式用 mem:;文件模式用 file:/path/db |
| SQLite | jdbc:sqlite:/path/to/database.db |
不支持并发写;Liquibase 需加 liquibase.sqlite.enableForeignKeys=true |
连接串验证技巧:在配置 Liquibase 之前,先用数据库原生客户端(如
sqlplus、mysql CLI、psql)测试 JDBC URL 中的主机、端口、服务名/数据库名是否可达。这一步能快速排除网络和认证问题。
4.4 驱动与连接串的匹配关系图
下图展示从 Liquibase 配置到数据库实例的完整驱动加载与连接建立流程,帮助你理解各组件之间的依赖关系。
4.5 冒烟检查:快速验证数据库连接
在编写第一个变更集之前,建议执行一次冒烟检查,确认 Liquibase 能够成功加载驱动并建立连接。以下是一个最小化的 liquibase.properties 配置示例:
# liquibase.properties 冒烟检查配置
changeLogFile: db/changelog/db.changelog-master.xml
driver: org.postgresql.Driver
url: jdbc:postgresql://localhost:5432/liquibase_demo?currentSchema=public
username: liquibase_user
password: liquibase_pass
liquibaseSchemaName: liquibase_schema
liquibaseTablespaceName: liquibase_tbs
执行以下命令验证连接:
# 使用 Liquibase CLI 执行 status 命令,不实际写入数据库
liquibase --defaultsFile=liquibase.properties status
# 预期输出示例:
# - Database: jdbc:postgresql://localhost:5432/liquibase_demo
# - Driver: PostgreSQL JDBC Driver 42.6.0
# - 1 change set has not been applied to postgresql@localhost
冒烟检查清单:
- 驱动 JAR 是否在类路径中(CLI 模式放在
lib/目录,Maven/Gradle 模式由构建工具管理) - JDBC URL 中的主机名、端口、数据库名是否与数据库实际配置一致
- 数据库用户是否具有
CREATE TABLE、CREATE SEQUENCE权限(Liquibase 需要创建 DATABASECHANGELOG 表) - 防火墙或安全组是否放通了对应端口
4.6 常见连接问题与排查
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
No suitable driver found |
驱动 JAR 未加载或驱动类名错误 | 检查类路径;确认 driver 属性值与驱动类完全一致 |
Connection refused |
端口错误、数据库未启动、防火墙拦截 | 使用 telnet host port 测试网络连通性 |
ORA-12505 / 08001 |
Oracle SID 或服务名错误 | 确认 service_name 在 tnsnames.ora 中正确 |
SSL handshake failed |
MySQL/PostgreSQL 强制 TLS 但客户端未配置 | 在 JDBC URL 中添加 useSSL=false 或配置信任证书 |
Schema "public" does not exist |
PostgreSQL 中 schema 名称大小写不匹配 | 使用小写 schema 名,或在 URL 中加 ?currentSchema=public |
最佳实践:在团队内维护一份
liquibase-drivers.md 文档,记录每个环境(开发/测试/生产)使用的驱动版本和 JDBC URL 模板。每次数据库升级或驱动更新后,执行一次冒烟检查并更新文档,避免因版本不匹配导致变更集执行失败。