liquibase

liquibase 可以帮助我们完成数据库脚本的管理以及迁移(在支持的情况下),使用起来也是非常的简单,在我们的环境比较多的时候尤为方便,省去了每次变动都要手动更改不同环境数据库的麻烦。更多的内容可以参阅官方文档。

liquibase 支持读取四种格式的文件:sql、xml、yaml、json。这几种文件的编写格式需要遵循 liquibase 的 官方定义。具体的写法本文也不予讲解,查阅官文即可。

如果后期不更换数据库,那么直接使用 sql 是最直观方便的。倘若后续需要数据库迁移,那么可以使用后三种的方式定义,选择哪种格式看自己的喜好,也可以混合使用,都是支持的。

liquibase 不会自动将变更写入文件中,需要我们手动添加更改,然后在不同环境中启动时,liquibase 会自动执行这些变更完成结构和数据的同步。这也是 liquibase 的核心工作内容。

为当前项目引入 liquibase

本文使用 maven 的方式,且假设现有项目使用的 pg,准备迁移至其它数据库。其它的方式可以参看官方文档。

引入依赖填写必要信息

pom.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<properties>
<liquibase.version>4.32.0</liquibase.version>
</properties>

<dependencies>
<!-- liquibase -->
<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
<version>${liquibase.version}</version>
</dependency>

<!-- 引入 pg 依赖 -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.7.5</version>
<scope>runtime</scope>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-maven-plugin</artifactId>
<version>${liquibase.version}</version>
<configuration>
<!-- 输出的文件名,文件的格式可以自定义,这里选择的 xml -->
<!-- <outputChangeLogFile>changelog.xml</outputChangeLogFile> -->
<!-- 数据库连接信息 -->
<url>jdbc:mysql://localhost:3306/db</url>
<username>root</username>
<password>root</password>
</configuration>
</plugin>
</plugins>
</build>

打开命令行执行以下命令:

1
2
3
4
5
6
7
8
# 只会导出表结构
mvn liquibase:generateChangeLog

# 导出数据并指定路径(如果 xml 中配置了以 xml 为主,命令行不会生效)
mvn liquibase:generateChangeLog -Dliquibase.diffTypes=data -Dliquibase.outputChangeLogFile=output/changelog.xml

# 生成时排除某张表
# -Dliquibase.diffExcludeObjects=table_name

这样当前数据库的 liquibase 脚本文件就生成了。我们将其放在 liquibase 的默认目录下 resourcces/db/changelog/,后续有什么变动按照对应的语法更改一下,然后不同环境重新运行一下程序就可以完成结构和数据的同步了。

不同环境同步/迁移至其它数据库使用

上面的步骤中,我们将现有的项目使用的数据库进行了 liquibase 的脚本生成备份,我们需要将这些脚本文件用起来,同步到其它的环境中或者是迁移至其它数据库中。

引入的依赖和上面相同,但此时不需要 liquibase-maven-plugin 插件。如果是迁移到其它数据库,需要引入相应的数据库的驱动,并更改配置文件 appllication.yml 的 database 连接信息。

在项目的 resources 目录(也是 liquibase 默认读取的文件路径)中创建 db/changelog/db.changelog-master.yaml 文件,内容如下:

1
2
3
4
databaseChangeLog:
- include:
relativeToChangelogFile: true
file: changelog.xml

其中 changelog.xml 文件和 db.changelog-master.yaml 文件同级。然后启动我们的数据库即可完成同步/迁移。

注意:本文全篇不在 application.yml 中配置 liquibase 的任何信息,使用的都是 liquibase 默认读取的文件名(db.changelog-master.sql,yml,json,xml)和路径名(resourcces/db/changelog),如果需要自定义则需要更改相关配置。
默认的主文件名称必须是 db.changelog-master.yaml,后缀不可写成 yml
目前,liquibase 的 gradle 使用方式是社区支持,如果想要更好、更及时的迁移,可以考虑使用 flyway。


本站由 江湖浪子 使用 Stellar 1.32.2 主题创建。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。