liquibase常见操作
1. 概述
Liquibase 是一个用于跟踪,管理和应用数据库变化的开源的数据库重构工具。它将所有数据库的变化(包括结构和数据) 都保存在XML文件中,便于版本控制。
本文主要介绍通过Maven Plugin的方式使用liquibase导入导出脚本。
2. 使用
从官方提供的文档 可以看出,liquibase提供了多种使用方式,例如Ant,CommandLine,Maven Plugin等等。下面将挑选比较常用的来进行说明,方便读者快速入门。
3.Maven Plugin
1.引入Maven Plugin
官方文档:https://docs.liquibase.com/tools-integrations/maven/maven-pom-file.html
在pom.xml文件中添加
<!-- Maven hierarchy of elements for your project -->
<build>
<pluginManagement>
<plugins>
<plugin>
<!--start with basic information to get Liquibase plugin:
include <groupId>, <artifactID>, and <version> elements-->
<groupId>org.liquibase</groupId>
<artifactId>liquibase-maven-plugin</artifactId>
<version>4.6.1</version>
<!-- <version>4.2.0</version>-->
<!-- <version>3.2.0</version>-->
<configuration>
<!--properties文件路径,该文件记录了数据库连接信息等-->
<propertyFile>src/main/resources/liquibase.properties</propertyFile>
<propertyFileWillOverride>true</propertyFileWillOverride>
<!--生成文件的路径-->
<outputChangeLogFile>src/main/resources/liquibase/changelog_dev.xml</outputChangeLogFile>
<!--也可在这里配置-->
<!-- <driver>com.mysql.jdbc.Driver</driver>
<url>jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8</url>
<username>root</username>
<password>egova</password>-->
</configuration>
<dependencies>
<!--set up any dependencies for Liquibase to function in your environment for example, a database-specific plugin-->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.199</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</pluginManagement>
</build>
2.最好导入数据库驱动jar包依赖,我用的本地jar包老是找不到,根据自己的需要替换jar包版本。
<dependencies>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc7</artifactId>
<version>12.1.0.1.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.44</version>
</dependency>
</dependencies>
3.添加liquibase.properties文件。
#liquibase
changeLogFile=src/main/resources/liquibase/db.changelog-master.xml
##.username 数据库用户名
#username=wtong
#
##.password 数据库密码
#password=wtong
#
##.url 数据库URL连接
#url=jdbc:oracle:thin:@localhost:1521:test
#
##.driverjar 数据库驱动jar名
#classpath=ojdbc7-12.1.0.1.0.jar
#
##.driver 数据库驱动类名
#driver=oracle.jdbc.driver.OracleDriver
############----------------mysql
#.username 数据库用户名
username=root
#.password 数据库密码
password=root
#.url 数据库URL连接
url=jdbc:mysql://localhost:3306/test?serverTimezone=UTC&characterEncoding=utf8&useSSL=false&useUnicode=true
#.driverjar 数据库驱动jar名
classpath=mysql-connector-java-5.1.44.jar
#.driver 数据库驱动类名
driver=com.mysql.jdbc.Driver
4.新建changelog文件入口: db.changelog-master.xml
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.8.xsd">
<include file="src/main/resources/liquibase/changelog_dev.xml"/>
</databaseChangeLog>
5.使用mvn命令
(1)对当前数据库状态生成 changlog:
mvn liquibase:generateChangeLog
(2)只对数据生成 changelog (先用别的方式往数据库创建数据后再用此方式生成changelog):
mvn liquibase:generateChangeLog -Dliquibase.diffTypes=data
区别:前者是生成数据库中表结构,后者没有。
这样的话就会在pom文件配置的输出位置生成changlog文件。
(3)将changelog变化的内容写入数据库:
mvn liquibase:update
(4)检查changelog语法的合法性
mvn liquibase:updateSQL
6.在项目中使用liquibase
@Bean
public SpringLiquibase liquibase(DataSource dataSource, LiquibaseProperties liquibaseProperties) {
SpringLiquibase liquibase = new SpringLiquibase(taskExecutor, env);
liquibase.setDataSource(dataSource);
//制定changelog的位置,这里使用的一个master文件引用其他文件的方式
liquibase.setChangeLog("classpath:config/liquibase/db.changelog-master.xml");
liquibase.setContexts(liquibaseProperties.getContexts());
liquibase.setDefaultSchema(liquibaseProperties.getDefaultSchema());
liquibase.setDropFirst(liquibaseProperties.isDropFirst());
return liquibase;
}
7.liquibase命令大全
命令名称 | 命令描述 |
---|---|
update | 更新数据库到当前版本 |
updateSQL | 写入SQL将数据库更新到currentversion或STDOUT |
updateCount | 将下一个NUM更改应用到数据库 |
updateCountSQL | 写入SQL以将下一个NUM更改应用到数据库 |
updateToTag | 使用指定的标记将数据库更新到变更集 |
updateToTagSQL | 使用指定的标记将SQL写入(到标准输出)到更改集 |
rollback | 将数据库回滚到指定标签的状态is was |
rollbackSQL | 生成数据库回滚到指定标签的sql |
rollbackToDate <date/time> | 将数据库回滚到给定日期/时间的状态is was。日期格式:yyyy-MM-dd 'HH: mm: ss |
rollbackToDateSQL <date/time> | 写入SQL以将数据库回滚到给定日期/时间版本的状态到STDOUT |
rollbackCount | 回滚应用于数据库的最后一个<值>更改集 |
rollbackCountSQL | 写入SQL以回滚最后一个<值>更改集到应用于数据库的stdoutapply |
futureRollbackSQL | 写入SQL,以便在更改日志中的更改完成后将数据库回滚到当前状态 |
futureRollbackSQL | 在更改日志中的<值>更改完成后,写入SQL以将数据库回滚到当前状态 |
futureRollbackFromTagSQL | 写入(到标准输出)SQL,以便在更改后将数据库回滚到其当前状态 |
updateTestingRollback | 更新数据库,然后再次回滚更改。用于测试回滚支持 |
generateChangeLog | 写入更改日志XML以将数据库的当前状态复制到标准输出 |
snapshot | 将数据库的当前状态写入标准输出 |
snapshotReference | 将referenceUrl数据库的当前状态写入标准输出 |
Diff Commands | 数据库对比命令 |
diff [diff parameters] | 数据库对比命令 |
diffChangeLog [diff parameters] | 数据库对比日志 |
Documentation Commands | 文档命令 |
dbDoc | 基于当前数据库和更改日志生成类似javadoc的文档 |
Maintenance Commands | 维护命令 |
tag | 给当前的数据库打标签,方便日后回滚 |
tagExists | 检查对应的标签是否存在 |
status [–verbose] | 输出为执行changeset的行数 |
unexpectedChangeSets[–verbose] | 输出本地不存在changeset 行数 |
validate | 检查是否有错误的changelog |
calculateCheckSum | 检查指定changeset id 的checksum值 格式为 filepath::id::author |
clearCheckSums | 从数据库日志中删除所有保存的校验和 |
changelogSync | 标记所有的更改已执行 |
changelogSyncSQL | 生成标记更改已执行的sql并输出到标准输出 |
markNextChangeSetRan | 将下一个变更标记为已执行 |
markNextChangeSetRanSQL | 生成将下一个变更标记为已执行的sql并输出到标准输出 |
listLocks | 列出liquibase数据库锁 |
releaseLocks | 释放所有的liquibase数据库锁 |
dropAll | 删除数据库表(慎用!) |