1.引入插件
pom.xml
xml
<plugin>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-maven-plugin</artifactId>
<version>4.24.0</version>
<configuration>
<!-- 基本的 Liquibase 配置 -->
<propertyFile>src/main/resources/liquibase.yml</propertyFile>
</configuration>
</plugin>
liquibase.yml
yaml
# Liquibase 数据库连接
driver: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/liquibase_demo
username: root
# 必填 ,变更日志位置
changeLogFile: src/main/resources/liquibase/db.changelog-master.xml
# 使用maven插件命令 liquibase:generateChangeLog 时输出的文件。 作用 将连接的数据库的表结构生成日志变更文件
outputChangeLogFile: /Users/kafeim/IdeaProjects/demo/src/main/resources/liquibase/db.changelog-diff.xml

maven 命令
liquibase:changelogSyncSQL
将变更日志中的文件标记为已执行的状态。这个时候还未执行,会把将要执行的SQL放在 targe\liquibase\migrate.sql 。
生成的migrate.sql文件
sql
-- *********************************************************************
-- SQL to add all changesets to database history table
-- *********************************************************************
-- Change Log: src/main/resources/liquibase/db.changelog-master.xml
-- Ran at: 2023/11/12 下午9:34
-- Against: root@localhost@jdbc:mysql://localhost:3306/liquibase_demo
-- Liquibase version: 4.20.0
-- *********************************************************************
-- Lock Database
UPDATE DATABASECHANGELOGLOCK SET `LOCKED` = 1, LOCKEDBY = 'kafeimdeMacBook-Pro.local (192.168.3.7)', LOCKGRANTED = NOW() WHERE ID = 1 AND `LOCKED` = 0;
INSERT INTO DATABASECHANGELOG (ID, AUTHOR, FILENAME, DATEEXECUTED, ORDEREXECUTED, MD5SUM, `DESCRIPTION`, COMMENTS, EXECTYPE, CONTEXTS, LABELS, LIQUIBASE, DEPLOYMENT_ID) VALUES ('1699778673366-1', 'kafeim (generated)', 'src/main/resources/liquibase/changelog/db.changelog-diff.xml', NOW(), 1, '8:17a4bb8928126f2ec2830e6199a4f73b', 'createTable tableName=t_user', '', 'EXECUTED', NULL, NULL, '4.20.0', '9796090139');
-- Release Database Lock
UPDATE DATABASECHANGELOGLOCK SET `LOCKED` = 0, LOCKEDBY = NULL, LOCKGRANTED = NULL WHERE ID = 1;
这里注意,maven 插件中的路径不要使用classpath来映射,会一直到不到路径的。

maven插件配置的路径都不能用 classpath
liquibase:changelogSync
将变更日志中的文件标记为已执行的状态。在执行这个命令前,最好先去运行 liquibase:changelogSyncSQL 生成SQL 审查一下需要执行的SQL
liquibase:tag
liquibase:tag
命令在 Liquibase 中用来给当前数据库的状态打上一个"标签"。 它是给变把你DATABASECHANGELOG表 最后一次执行的变更日志的记录的 tag 属性的值改成了你定义的版本

注意: 在运行这个命令前确保 tag 的值是唯一的。确保DATABASECHANGELOG已经存在记录了。
tag的作用
- 可以用来回滚,回滚时可以指定回滚到标记的那个变更日志的记录
- 可以用来修改已执行状态命令的范围 liquibase:changelogSyncToTag
liquibase:changelogSyncToTagSQL
liquibase:changelogSyncToTagSQL
命令在 Liquibase 中用于生成 SQL 语句,这些语句会将变更日志文件中直到指定标签为止的所有变更集标记为已执行,但实际上并不执行这些 SQL。 生成的sql 文件会在 targe\liquibase\migrate.sql 目录下。
xml
<plugin>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-maven-plugin</artifactId>
<configuration>
<!-- 基本的 Liquibase 配置 -->
<propertyFile>src/main/resources/liquibase.yml</propertyFile>
<toTag>v2.0</toTag>
</configuration>
</plugin>
liquibase:changelogSyncToTag
liquibase:changelogSyncToTag 会将变更日志文件中直到指定标签为止的所有变更集标记为已执行
最好先运行 liquibase:changelogSyncToTagSQL 生成SQL查看下是否正确。
按道理来说,存在DATABASECHANGELOG 表的记录都是已经执行的记录。但是在某些情况下,数据库可能由于手动执行的 SQL 而更新,而这些更新没有通过 Liquibase 进行跟踪。如果这些变更对应于一个已知的标签,那么使用 changelogSyncToTagSQL
可以帮助将 DATABASECHANGELOG
表与实际数据库状态同步。 这里指定是手动执行了SQL ,并且又手动往 DATABASECHANGELOG 表增加了记录的情况。
liquibase:clearCheckSums
liquibase:clearCheckSums
命令清除校验和后,Liquibase 不会 重新执行任何变更集。此命令只是简单地清除 DATABASECHANGELOG
表中每个变更集的校验和值。
下次当您运行 liquibase:update
或者任何执行变更集的命令时,Liquibase 会为那些没有校验和的变更集重新计算并保存新的校验和。这个过程不涉及执行变更集中的任何数据库修改操作,它只是更新了 DATABASECHANGELOG
表中记录的校验和信息。
这里的校验和 指的是数据库中 MD5SUM 字段。
liquibase:diff
数据库差异对比,对比两个数据库结构的差异并生成变更日志。
1. 数据库与数据库对比
xml
# 必填 ,变更日志位置
changeLogFile: src/main/resources/liquibase/db.changelog-master.xml
# Liquibase 数据库连接
driver: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/liquibase_demo
username: root
# 参照数据库
referenceUrl: jdbc:mysql://localhost:3306/demo
referenceUsername: root
# 差异文件位置
diffChangeLogFile: src/main/resources/diff/liquibase-diff-result2.xml

2. 数据库与快照 进行对比。
xml
# Liquibase 数据库连接
driver: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/liquibase_demo
username: root
# 必填 ,变更日志位置
changeLogFile: src/main/resources/liquibase/db.changelog-master.xml
# 如果变更日志中包含其他变更日志,需要指定变更日志的位置
# liquibase:diff 命令时需要的参数,参照数据库
referenceUrl: offline:mysql?snapshot=src/main/resources/liquibase/a.json
diffChangeLogFile: /Users/kafeim/IdeaProjects/demo/src/main/resources/diff/liquibase-diff-result.xml
offline:mysql
表示离线数据库,用来加载数据库快照的。 snapshot=src/main/resources/liquibase/a.json
这里的路径一定不能使用 classpath ,识别不了。
数据库快照生成方式有两种
- 通过cli 生成。
- 通过Java API生成
目录的maven插件还未提供相快照关的命令
liquibase:generateChangeLog
liquibase.yml 配置文件
yml
changeLogFile: src/main/resources/liquibase/db.changelog-master.xml
url: jdbc:mysql://127.0.0.1:33306/liquibase_demo
username: root
driver: com.mysql.cj.jdbc.Driver
outputChangeLogFile: src/main/resources/liquibase/db.changelog-result.xml
dataDir: src/main/resources/liquibase/data
这个命令是用来生成 changelog 变更日志的,它会连接数据库将数据库的表结构转换成 changelog 变更日志,并输出到 outputChangeLogFile 设置的位置,这个只会生成数据结构的变更日志。
dataDir属性,如果填写了会将数据以csv的文件格式写入到这个位置

如果是生成带数据库导入的,记得将 src/main/resources/liquibase/changelog/data/t_user.csv
改为 calsspath:liquibase/changelog/data/t_user.csv
不然项目启动时识别不了 src 路径的。
还有输出的文件outputChangeLogFile
可以输出成SQL ,但是输出的名称要规范。
例如:
- src/main/resources/liquibase/db.changelog-result.mysql.sql
- src/main/resources/liquibase/db.changelog-result.h2.sql
liquibase:updateSQL
根据配置的 changeLogFile
文件生成要执行的 迁移SQL。在确定执行迁移操作前,可以先使用此命令生成迁移的SQL进行审查。

liquibase:update
根据配置的 changeLogFile
文件生成要执行的 迁移操作