1、LiquiBase简介

LiquiBase是一个用于数据库重构和迁移的开源工具,通过日志文件的形式记录数据库的变更,然后执行日志文件中的修改,将数据库更新或回滚到一致的状态。LiquiBase的主要特点有:

  • 支持几乎所有主流的数据库,如MySQL, PostgreSQL, Oracle, Sql Server, DB2等;
  • 支持多开发者的协作维护;
  • 日志文件支持多种格式,如XML, YAML, JSON, SQL等;
  • 支持多种运行方式,如命令行、Spring集成、Maven插件、Gradle插件等;

2、日志文件changeLog

changelog是LiquiBase用来记录数据库的变更,一般放在CLASSPATH下,然后配置到执行路径中。

changelog支持多种格式,主要有XML/JSON/YAML/SQL,推荐使用xml格式。官网格式

一个标签对应一个变更集,由属性id、name,以及changelog的文件路径唯一标识。

changelog在执行的时候并不是按照id的顺序,而是按照changeSet在changelog中出现的顺序。

changelog中的一个changeSet对应一个事务,在changeSet执行完后commit,如果出现错误则rollback。

3、简单入门使用

1)在application.properties中配置changeLog路径

# liquibase配置
liquibase.enabled=true
#默认位置
#liquibase.change-log=classpath:/db/changelog/db.changelog-master.yaml liquibase.change-log=classpath:/db/changelog/sqlData.xml

2)xml配置sample

<?xml version="1.0" 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-2.0.xsd"> <changeSet author="yejg" id="sql-01">
<sqlFile path="classpath:db/changelog/sqlfile/init.sql" encoding="UTF-8" />
<sqlFile path="classpath:db/changelog/sqlfile/users.sql" encoding="UTF-8" />
</changeSet> <changeSet author="yejg" id="sql-02">
<sqlFile path="classpath:db/changelog/sqlfile/users2.sql" encoding="UTF-8" />
</changeSet> </databaseChangeLog>

3)要执行的sql

--- init.sql
CREATE TABLE usersTest(
user_id varchar2(14) DEFAULT ' ' NOT NULL,
user_name varchar2(128) DEFAULT ' ' NOT NULL
) STORAGE(FREELISTS 20 FREELIST GROUPS 2) NOLOGGING TABLESPACE USER_DATA; insert into usersTest(user_id,user_name) values ('0','测试');

4)启动项目时,日志效果

2019-02-19 15:15:22,425[INFO][main][][][] {dataSource-1} inited [com.alibaba.druid.pool.DruidDataSource.init(DruidDataSource.java:721)]
2019-02-19 15:15:23,065[INFO][main][][][] Could not set remarks reporting on OracleDatabase: com.alibaba.druid.pool.DruidPooledConnection.setRemarksReporting(boolean) [org.springframework.boot.liquibase.CommonsLoggingLiquibaseLogger.info(CommonsLoggingLiquibaseLogger.java:92)]
2019-02-19 15:15:24,036[INFO][main][][][] Successfully acquired change log lock [org.springframework.boot.liquibase.CommonsLoggingLiquibaseLogger.info(CommonsLoggingLiquibaseLogger.java:92)]
2019-02-19 15:15:25,469[INFO][main][][][] Creating database history table with name: DATABASECHANGELOG [org.springframework.boot.liquibase.CommonsLoggingLiquibaseLogger.info(CommonsLoggingLiquibaseLogger.java:92)]
2019-02-19 15:15:25,496[INFO][main][][][] Reading from DATABASECHANGELOG [org.springframework.boot.liquibase.CommonsLoggingLiquibaseLogger.info(CommonsLoggingLiquibaseLogger.java:92)]
2019-02-19 15:15:25,574[INFO][main][][][] classpath:/db/changelog/sqlData.xml: classpath:/db/changelog/sqlData.xml::sql-01::yejg: SQL in file classpath:db/changelog/sqlfile/init.sql executed [org.springframework.boot.liquibase.CommonsLoggingLiquibaseLogger.info(CommonsLoggingLiquibaseLogger.java:92)]
2019-02-19 15:15:25,581[INFO][main][][][] classpath:/db/changelog/sqlData.xml: classpath:/db/changelog/sqlData.xml::sql-01::yejg: SQL in file classpath:db/changelog/sqlfile/users.sql executed [org.springframework.boot.liquibase.CommonsLoggingLiquibaseLogger.info(CommonsLoggingLiquibaseLogger.java:92)]
2019-02-19 15:15:25,586[INFO][main][][][] classpath:/db/changelog/sqlData.xml: classpath:/db/changelog/sqlData.xml::sql-01::yejg: ChangeSet classpath:/db/changelog/sqlData.xml::sql-01::yejg ran successfully in 58ms [org.springframework.boot.liquibase.CommonsLoggingLiquibaseLogger.info(CommonsLoggingLiquibaseLogger.java:92)]
2019-02-19 15:15:25,624[INFO][main][][][] classpath:/db/changelog/sqlData.xml: classpath:/db/changelog/sqlData.xml::sql-02::yejg: SQL in file classpath:db/changelog/sqlfile/users2.sql executed [org.springframework.boot.liquibase.CommonsLoggingLiquibaseLogger.info(CommonsLoggingLiquibaseLogger.java:92)]
2019-02-19 15:15:25,627[INFO][main][][][] classpath:/db/changelog/sqlData.xml: classpath:/db/changelog/sqlData.xml::sql-02::yejg: ChangeSet classpath:/db/changelog/sqlData.xml::sql-02::yejg ran successfully in 10ms [org.springframework.boot.liquibase.CommonsLoggingLiquibaseLogger.info(CommonsLoggingLiquibaseLogger.java:92)]
2019-02-19 15:15:25,649[INFO][main][][][] Successfully released change log lock [org.springframework.boot.liquibase.CommonsLoggingLiquibaseLogger.info(CommonsLoggingLiquibaseLogger.java:92)]

5)简单原理分析

在执行changelog的时候,liquibase会在数据库中新建2张表,写执行记录:

  • databasechangelog
  • databasechangeloglock

6)生成已有数据库的changeLog

首先,在pom文件中增加如下配置

<build>
<plugins>
<plugin>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-maven-plugin</artifactId>
<version>3.4.2</version>
<configuration>
<propertyFile>src/main/resources/liquibase.properties</propertyFile>
<propertyFileWillOverride>true</propertyFileWillOverride>
<!--生成文件的路径-->
<outputChangeLogFile>src/main/resources/changelog_dev.xml</outputChangeLogFile>
</configuration>
</plugin>
</plugins>
</build>

其中,liquibase.properties的配置如下

changeLogFile=src/main/resources/db/changelog/sqlData.xml
driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@XXXX
username=XXX
password=XXX
verbose=true
## 生成文件的路径
outputChangeLogFile=src/main/resources/changelog_dev.xml

然后,执行【mvn liquibase:generateChangeLog】命令,就会生成changelog_dev.xml文件

4、其他应用

为减少部署实施的工作量,可以利用liquibase在项目中配置好sql和changeLog,让项目启动的时候,就自动去打sql脚本,实现自动化处理。

不过,目前发现liquibase不支持执行语句块,暂未找到解决办法。

Liquibase使用入门的更多相关文章

  1. 【原创】SpringBoot & SpringCloud 快速入门学习笔记(完整示例)

    [原创]SpringBoot & SpringCloud 快速入门学习笔记(完整示例) 1月前在系统的学习SpringBoot和SpringCloud,同时整理了快速入门示例,方便能针对每个知 ...

  2. liquibase之快速入门

    第一步: 创建一个Changelog File: 这个database  Changelog file列举了数据库中所有的改变情况,该文件是以xml为基础的,下面是一个空的xml文件: <?xm ...

  3. MySQL 菜鸟入门“秘籍”

    一.MySQL简介 1.什么是数据库 ? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,它产生于距今六十多年前,随着信息技术和市场的发展,特别是二十世纪九十年代以后,数据管理不 ...

  4. springboot简单入门笔记

    一.Spring Boot 入门 1.Spring Boot 简介 简化Spring应用开发的一个框架: 整个Spring技术栈的一个大整合: J2EE开发的一站式解决方案: 2.微服务 2014,m ...

  5. MySQL菜鸟入门“秘籍”

    一.MySQL简介 1.什么是数据库 ? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,它产生于距今六十多年前,随着信息技术和市场的发展,特别是二十世纪九十年代以后,数据管理不 ...

  6. 【转载】Spring boot学习记录(一)-入门篇

    前言:本系列文章非本人原创,转自:http://tengj.top/2017/04/24/springboot0/ 正文 首先声明,Spring Boot不是一门新技术.从本质上来说,Spring B ...

  7. 【01】SpringBoot2核心技术-基础入门

    SpringBoot 2 1. SpringBoot2核心技术-基础入门 01 Spring与SpringBoot 1.Spring 能做什么 1.1 Spring的能力 微服务:将一个应用的所有功能 ...

  8. Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求

    上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...

  9. ABP入门系列(1)——学习Abp框架之实操演练

    作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...

随机推荐

  1. Javascript上传超大文件实例

    因业务需求需要向伺服器上传大于1GB以上的视频文件,其实网上也能找到很多大文件上传的第三方组件,问题是要么用起来相当不方便,总出现一些bug,要么收费太贵(费用几千,甚至还限定使用数量),最终自己开发 ...

  2. tomcat的调优管理

    1 记性调整存设定. A: 方法如下: 1. linux 下编辑tomcat安装目录下的bin目录下的catalina.sh文件,windows下为catalina.bat vi  catalina. ...

  3. [Project] MiniSearch文本检索简介

    1. 预处理过程 预处理主要用来事先生成程序在运行过程中可能用到的数据,以便加速处理时间. 预处理的过程主要生成程序所需的三个文件:网页库文件,网页位置信息文件和倒排索引文件. 网页库文件 其中网页库 ...

  4. 「NOI2018」屠龙勇士(EXCRT)

    「NOI2018」屠龙勇士(EXCRT) 终于把传说中 \(NOI2018D2\) 的签到题写掉了... 开始我还没读懂题目...而且这题细节巨麻烦...(可能对我而言) 首先我们要转换一下,每次的 ...

  5. Android开发的插件Code Generator与LayoutCreator的安装与使用,提升你的开发效率

    前言 大家好,给大家带来Android开发的插件Code Generator与LayoutCreator的安装与使用,提升你的开发效率的概述,希望你们喜欢 学习目标 掌握两个插件的安装和使用,能够实现 ...

  6. Spring.Net实现跨数据库服务层事务管理

    在实际项目中用了Spring.Net框架之后,发现这框架在处理数据库事务上特别强大,声明式的数据库事务解放了一般开发人员对数据库事务操作的复杂处理.尤其是多数据库事务处理上,尤为显得更简便,几个简单的 ...

  7. Linux - 创建定时任务

    crontab命令 用来创建周期性定时任务 crontab {-l|-r|-e} -l 显示当前的 crontab -r 删除当前的 crontab -e 使用编辑器编辑当前 crontab 文件 输 ...

  8. LeetCode:145_Binary Tree Postorder Traversal | 二叉树后序遍历 | Hard

    题目:Binary Tree Postorder Traversal 二叉树的后序遍历,题目要求是采用非递归的方式,这个在上数据结构的课时已经很清楚了,二叉树的非递归遍历不管采用何种方式,都需要用到栈 ...

  9. druid的关键参数+数据库连接池运行原理

      minEvictableIdleTimeMillis :连接保持空闲而不被驱逐的最长存活时间.(默认30分钟) Destory线程中如果检测到当前连接的最后活跃时间和当前时间的差值大于minEvi ...

  10. 【sping揭秘】23、Spring框架内的JNDI支持

    JndiTemplate 经过jdbctemplate,transactionTemplate...的洗礼,想必大家看到template就知道是个什么尿性了吧 一样的,我们只需要调用jnditempl ...