Liquibase作为一款开源的数据库架构变更管理工具,可以帮助开发者方便跟踪、管理数据库变化的修订。其支持MySQL、PostgreSQL、Oracle等众多数据库
集成Spring
Spring boot内置了对Liquibase的支持,只需要在项目中引入Liquibase依赖并进行配置即可
1 | <!--Liquibase--> |
对于配置而言,Liquibase默认会使用Spring配置项的数据库连接。如果期望不使用该默认配置,也可以显式单独配置
1 | # 数据库配置 |
在上面的配置项spring.liquibase.change-log中我们指定了Liquibase 变更记录的位置。事实上,通常这只是一个master配置文件,如下所示。其中通过include标签来包含、汇聚所有的changlog文件
1 | <?xml version="1.0" encoding="UTF-8"?> |
目录结构如下所示
详解ChangeLog
一个典型地changlog文件如下所示,其记录了我们对数据库的变更、修订内容。这里我们使用XML进行介绍,其实Liquibase支持SQL、XML、JSON、YAML等多种形式
1 | <?xml version="1.0" encoding="UTF-8"?> |
- changeSet标签:出于便于阅读的角度考虑,每个changeSet每次只包含对一张表的修订操作。同时,对于已执行过changeSet一般情况下不应做任何修改
- runOnChange属性:用于控制每次运行changeSet时,如果本次changeSet发生修改是否重新执行。其默认值为false,当本次changeSet发生修改不会执行变更,而是会发出错误以提醒发生了意外修改。其原理是通过比对changeSet的MD5校验和、存储在DATABASECHANGELOG表中的MD5SUM进行 判定的。典型地对于存储过程场景而言,该属性一般设置为true。这样每次对历史changeSet进行修改后,都需要Liquibase重新执行该changeSet以保证修改生效
- preConditions标签:控制数据库变更的先决条件。如果先决条件满足要求,则会执行该标签后相应的数据库变更;如果先决条件在执行过程抛出异常,则行为由onError属性控制;如果先决条件不满足要求,则行为由onFail属性控制;
- onFail、onError属性:preConditions标签的onFail、onError属性可用的取值有:
- CONTINUE:跳过该changeSet、会在下次更新时再次尝试。继续执行changeLog
- HALT:停止执行整个changeLog。这也是默认值
- MARK_RAN:跳过该changeSet同时将其标记为已执行。继续执行changeLog
- WARN:发出警告并继续执行changeSet、changeLog
- tagDatabase:对本次版本的数据库修订打标签
至此当我们启动SpringBoot项目后,即可发现数据库不仅包含了我们期望的业务表,还新增了两张Liquibase相关的表——DATABASECHANGELOG、DATABASECHANGELOGLOCK
而对于DATABASECHANGELOGLOCK锁表而言,如果某记录的LOCKED字段为1,则表示该锁被占有了。故在Liquibase锁无法正常释放时,可能会导致无法创建表,这时可通过手动置零来释放锁
生成ChangeLog
liquibase-maven-plugin可以帮助我们直接地从数据库中创建、生成相应的ChangeLog文件,配置如下
1 | <build> |
操作、效果如下所示