文章目录
介绍
快速使用
Springboot中
引入依赖
配置日志文件ChangeLog
编写变更记录ChangeSet
Maven中
引入依赖
配置liquibase.properties
编写变更记录ChangeSet
版本回滚
回滚指定次数
回滚到指定tag
输出回滚语句
输出变更记录
一些规范
参考资料
介绍
Liquibase是一个用于数据库重构和迁移的开源工具,通过日志文件的形式记录数据库的变更,然后执行日志文件中的修改,将数据库更新或回滚到一致的状态。它的目标是提供一种数据库类型无关的解决方案,通过执行schema类型的文件来达到迁移。其有点主要有以下:
支持几乎所有主流的数据库,如MySQL, PostgreSQL, Oracle, Sql Server, DB2等;
支持多开发者的协作维护;
日志文件支持多种格式,如XML, YAML, JSON, SQL等;
支持多种运行方式,如命令行、Spring集成、Maven插件、Gradle插件等。
快速使用
Springboot中
引入依赖
<dependencies> <dependency> <groupId>org.liquibase</groupId> <artifactId>liquibase-core</artifactId> </dependency> <dependency> </dependencies>
配置日志文件ChangeLog
- 在
resources
目录中创建/db/changelog
目录作为日志文件存放目录 - 在目录中创建日志文件
db.changelog-master.yml
- 在
application.yml
中配置changelog路径
spring: liquibase: # 不配置默认会查找'classpath:/db/changelog/db.changelog-master.yaml'文件 change-log: 'classpath:/db/changelog/db.changelog-master.yml'
编写变更记录ChangeSet
- 编写初始数据库脚本
databaseChangeLog: - changeSet: # 唯一id,建议使用Flayway的命名格式'V<version>[_<SEQ>][__description]' id: V1.0_0__init # 作者 author: Cheivin # 描述 comment: "初始化脚本内容,加载初始数据" # 启用事物 runInTransaction: true # 变更脚本 changes: # 创建表格 - createTable: tableName: user columns: - column: name: id type: int autoIncrement: true constraints: primaryKey: true nullable: false remarks: - column: name: username type: VARCHAR(50) constraints: nullable: false - column: name: password type: VARCHAR(50) constraints: nullable: false # 加载数据 - loadData: tableName: user columns: - column: header: username name: username - column: header: password name: password encoding: UTF-8 file: db/data/init-data.csv # 标记,用于回滚时指定版本 - tagDatabase: tag: V1.0_0__init
- 运行项目后,查看数据库
- 修改changelog,增加变更数据库脚本
# 在databaseChangeLog后追加 - changeSet: id: V1.0_1__mod author: Cheivin comment: "修改用户表,增加账单表" runInTransaction: true changes: # 通过标准格式添加字段 - addColumn: # 目标表 tableName: user columns: - column: name: state type: tinyint # 默认值 defaultValueNumeric: 0 remarks: '用户状态,0:未激活,1:激活,-1:禁用' - column: name: identity type: int # 默认值 defaultValueNumeric: 999 remarks: '用户身份,999:管理员' # 通过sql语句操作数据库 - sql: sql: insert into user (username,password,state,identity) values ('admin','admin',1,999) # 通过sql文件操作数据库 - sqlFile: encoding: utf8 path: db/changelog/V1.0_1__mod_bill.sql - tagDatabase: tag: V1.0_1__mod # 回滚语句 - rollback: - delete: tableName: user where: username='admin' - dropTable: tableName: user_bill
Maven中
引入依赖
<build> <plugins> <plugin> <groupId>org.liquibase</groupId> <artifactId>liquibase-maven-plugin</artifactId> <version>3.6.3</version> <configuration> <!-- 配置文件,必须放在resource目录下 --> <propertyFile>src/main/resources/liquibase/liquibase.properties</propertyFile> </configuration> <executions> <!-- 默认mvn启动时执行更新操作 --> <execution> <phase>process-resources</phase> <goals> <goal>update</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
配置liquibase.properties
# 日志文件路径,必须放在resource目录下 changeLogFile=src/main/resources/liquibase/db.changelog-master.yml # 数据库地址 url=jdbc:mysql://localhost:3306/liquibase_mvn?useSSL=false&useUnicode=true&characterEncoding=UTF-8 # 账号 username=root # 密码 password=root
编写变更记录ChangeSet
- 编写初始数据库脚本
databaseChangeLog: - changeSet: # 唯一id,建议使用Flayway的命名格式'V<version>[_<SEQ>][__description]' id: V1.0_0__init # 作者 author: Cheivin # 描述 comment: "初始化脚本内容,加载初始数据" # 启用事物 runInTransaction: true # 变更脚本 changes: # 创建表格 - createTable: tableName: user remarks: '用户表' columns: - column: name: id type: int autoIncrement: true constraints: primaryKey: true nullable: false - column: name: username type: VARCHAR(50) constraints: nullable: false remarks: '用户名' - column: name: password type: VARCHAR(50) constraints: nullable: false remarks: '密码' # 加载数据 - loadData: tableName: user columns: - column: header: username name: username - column: header: password name: password encoding: UTF-8 file: src/main/resources/liquibase/data/init-data.csv # 标记,用于回滚时指定版本 - tagDatabase: tag: V1.0_0__init
- 运行项目后,查看数据库
- 修改changelog,增加变更数据库脚本
# 在databaseChangeLog后追加 - changeSet: id: V1.0_1__mod author: Cheivin comment: "修改用户表,增加账单表" runInTransaction: true changes: # 通过标准格式添加字段 - addColumn: # 目标表 tableName: user columns: - column: name: state type: tinyint # 默认值 defaultValueNumeric: 0 remarks: '用户状态,0:未激活,1:激活,-1:禁用' - column: name: identity type: int # 默认值 defaultValueNumeric: 999 remarks: '用户身份,999:管理员' # 通过sql语句操作数据库 - sql: sql: insert into user (username,password,state,identity) values ('admin','admin',1,999) # 通过sql文件操作数据库 - sqlFile: encoding: utf8 path: src/main/resources/liquibase/V1.0_1__mod_bill.sql - tagDatabase: tag: V1.0_1__mod # 回滚语句 - rollback: - delete: tableName: user where: username='admin' - dropTable: tableName: user_bill
版本回滚
回滚指定次数
命令格式
mvn liquibase:rollback -Dliquibase.rollbackCount=次数
eg:
mvn liquibase:rollback -Dliquibase.rollbackCount=1
回滚到指定tag
命令格式
mvn liquibase:rollback -Dliquibase.rollbackTag=tag名称
eg:
mvn liquibase:rollback -Dliquibase.rollbackTag=V1.0_0__init
输出回滚语句
命令格式
mvn liquibase:rollbackSQL -Dliquibase.rollbackCount=次数
mvn liquibase:rollbackSQL -Dliquibase.rollbackTag=tag名称
将会在target/liquibase目录中生成migrate.sql文件
输出变更记录
命令格式
mvn liquibase:dbDoc
将会在target/liquibase目录中生成dbDoc目录,打开index.html可查看
一些规范
ChangeSet id建议使用Flayway的命名格式V<version>[_<SEQ>][__description],如V1.0_0__init。或使用[任务ID]-[日期]-[序号],如T100-20190705-001
ChangeSet必须填写author
Liquibase禁止对业务数据进行sql操作
所有表,列要加remarks进行注释
已经执行过的ChangeSet严禁修改。
不要随便升级项目liquibase版本,特别是大版本升级。不同版本ChangeSet MD5SUM的算法不一样。
参考资料
官方文档 http://www.liquibase.org/documentation/
changeset配置文档 http://www.liquibase.org/documentation/changes/index.html
————————————————
版权声明:本文为CSDN博主「Cheivin」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhao0416/article/details/94733610
————————————————
版权声明:本文为CSDN博主「Cheivin」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhao0416/article/details/94733610