Liquibase使用入門

一、LiquiBase簡介

LiquiBase是一個用於數據庫重構和遷移的開源工具,經過日誌文件的形式記錄數據庫的變動,而後執行日誌文件中的修改,將數據庫更新或回滾到一致的狀態。LiquiBase的主要特色有:html

  • 支持幾乎全部主流的數據庫,如MySQL, PostgreSQL, Oracle, Sql Server, DB2等;
  • 支持多開發者的協做維護;
  • 日誌文件支持多種格式,如XML, YAML, JSON, SQL等;
  • 支持多種運行方式,如命令行、Spring集成、Maven插件、Gradle插件等;

二、日誌文件changeLog

changelog是LiquiBase用來記錄數據庫的變動,通常放在CLASSPATH下,而後配置到執行路徑中。java

changelog支持多種格式,主要有XML/JSON/YAML/SQL,推薦使用xml格式。官網格式spring

一個 標籤對應一個變動集,由屬性id、name,以及changelog的文件路徑惟一標識。 sql

changelog在執行的時候並非按照id的順序,而是按照changeSet在changelog中出現的順序。數據庫

changelog中的一個changeSet對應一個事務,在changeSet執行完後commit,若是出現錯誤則rollback。oracle

三、簡單入門使用

1)在application.properties中配置changeLog路徑app

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

liquibase.change-log=classpath:/db/changelog/sqlData.xml

2)xml配置samplemaven

<?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)要執行的sqlide

--- 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文件

四、其餘應用

爲減小部署實施的工做量,能夠利用liquibase在項目中配置好sql和changeLog,讓項目啓動的時候,就自動去打sql腳本,實現自動化處理。

不過,目前發現liquibase不支持執行語句塊,暫未找到解決辦法。

相關文章
相關標籤/搜索