使用 LiquiBase 管理數(shù)據(jù)庫(kù)變更 數(shù)據(jù)庫(kù)版本管理(含與Spring Boot Gradle Liquibase 插件整合的demo)

轉(zhuǎn)載自www.youngboy.vip

demo 地址 https://gitee.com/youngboyvip/liquibase-demo

使用 LiquiBase 管理數(shù)據(jù)庫(kù)變更


首先來(lái)了解下liquibase是什么

Liquibase是一個(gè)用于跟蹤、管理和應(yīng)用數(shù)據(jù)庫(kù)變化的開(kāi)源的數(shù)據(jù)庫(kù)重構(gòu)工具。它將所有數(shù)據(jù)庫(kù)的變化(包括結(jié)構(gòu)和數(shù)據(jù))都保存在XML文件中,便于版本控制

liquibase 可以干嘛剪勿?

  • 不依賴于特定的數(shù)據(jù)庫(kù),目前支持包括Oracle/Sql Server/DB2/MySql/Sybase/PostgreSQL/Caché等12種數(shù)據(jù)庫(kù),這樣在數(shù)據(jù)庫(kù)的部署和升級(jí)環(huán)節(jié)可幫助應(yīng)用系統(tǒng)支持多數(shù)據(jù)庫(kù)。
  • 提供數(shù)據(jù)庫(kù)比較功能具垫,比較結(jié)果保存在XML中,基于該XML你可用Liquibase輕松部署或升級(jí)數(shù)據(jù)庫(kù)试幽。
  • 以XML存儲(chǔ)數(shù)據(jù)庫(kù)變化筝蚕,其中以作者和ID唯一標(biāo)識(shí)一個(gè)變化(ChangSet),支持?jǐn)?shù)據(jù)庫(kù)變化的合并铺坞,因此支持多開(kāi)發(fā)人員同時(shí)工作起宽。
  • 在數(shù)據(jù)庫(kù)中保存數(shù)據(jù)庫(kù)修改歷史(DatabaseChangeHistory),在數(shù)據(jù)庫(kù)升級(jí)時(shí)自動(dòng)跳過(guò)已應(yīng)用的變化(ChangSet)济榨。
  • 提供變化應(yīng)用的回滾功能坯沪,可按時(shí)間、數(shù)量或標(biāo)簽(tag)回滾已應(yīng)用的變化擒滑。通過(guò)這種方式腐晾,開(kāi)發(fā)人員可輕易的還原數(shù)據(jù)庫(kù)在任何時(shí)間點(diǎn)的狀態(tài)。
  • 可生成數(shù)據(jù)庫(kù)修改文檔(HTML格式)
  • 提供數(shù)據(jù)重構(gòu)的獨(dú)立的IDE和Eclipse插件橘忱。

傳統(tǒng)的開(kāi)發(fā)模式中的數(shù)據(jù)庫(kù)修改之為什么使用liquibase

在日常的項(xiàng)目開(kāi)發(fā)中赴魁,開(kāi)發(fā)團(tuán)隊(duì)經(jīng)常將數(shù)據(jù)庫(kù)和應(yīng)用程序視為單獨(dú)的實(shí)體卸奉,這樣就導(dǎo)致了數(shù)據(jù)庫(kù)團(tuán)隊(duì)與應(yīng)用開(kāi)發(fā)團(tuán)隊(duì)分離造成團(tuán)隊(duì)之間信息交流不暢钝诚,信息交流不及時(shí),這種情況通常表現(xiàn)為下面幾種行為

  • 手工變更數(shù)據(jù)庫(kù)
  • 不能與團(tuán)隊(duì)的其他成員分享數(shù)據(jù)庫(kù)變更
  • 使用不一致的方法變更數(shù)據(jù)庫(kù)或數(shù)據(jù)
  • 使用低效的手工方法管理數(shù)據(jù)庫(kù)版本之間的變更

上面的幾種行為都是我們?cè)趯?shí)際開(kāi)發(fā)中遇到的問(wèn)題榄棵,不僅效率低而且出錯(cuò)的機(jī)率也高凝颇,就算是老司機(jī)也會(huì)翻車

解決上面問(wèn)題的思路是 減少人工手工變更數(shù)據(jù)庫(kù)的機(jī)會(huì)潘拱,用程序管理數(shù)據(jù)庫(kù)版本的更替

使用liquibase 管理數(shù)據(jù)庫(kù)的變更

使用步驟

  • step1: 創(chuàng)建一個(gè)數(shù)據(jù)庫(kù) 變更日志(change log)文件。
  • step2: 在變更日志文件內(nèi)部創(chuàng)建一個(gè) 變更集(change set)拧略。
  • step3: 通過(guò)命令行或構(gòu)建腳本對(duì)數(shù)據(jù)庫(kù)運(yùn)行變更集芦岂。
  • step4: 檢驗(yàn)數(shù)據(jù)庫(kù)中的變更。

step1:創(chuàng)建change log文件(changlog.xml)

change log 文件不一定要用xml寫 還可以使用json sql

<?xml version="1.0" encoding="UTF-8"?>

<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.1.xsd">

</databaseChangeLog>

step2: 添加變更集

<?xml version="1.0" encoding="UTF-8"?>

<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.1.xsd">

    <changeSet id="1" author="bob">
        <createTable tableName="department">
            <column name="id" type="int">
                <constraints primaryKey="true" nullable="false"/>
            </column>
            <column name="name" type="varchar(50)">
                <constraints nullable="false"/>
            </column>
            <column name="active" type="boolean" defaultValueBoolean="true"/>
        </createTable>
    </changeSet>

</databaseChangeLog>

每個(gè)更改集都用“id”屬性和“author”屬性唯一標(biāo)識(shí)垫蛆∏葑睿“作者”屬性可以最大限度地減少重復(fù)的可能性。
liquibase將每個(gè)更改集視為要應(yīng)用于數(shù)據(jù)庫(kù)的原子更改袱饭。通常最好只在更改集中包含一個(gè)更改

step3: 運(yùn)行ChangeSet
liquibase 可以使用命令行 Ant Maven Spring等工具運(yùn)行
命令演示

liquibase --driver=com.mysql.jdbc.Driver \
     --classpath=/path/to/classes \
     --changeLogFile=com/example/db.changelog.xml \
     --url="jdbc:mysql://localhost/example" \
     --username=user \
     --password=asdf \
     update

step4: 檢查你的數(shù)據(jù)庫(kù)
你可以看到數(shù)據(jù)庫(kù)現(xiàn)在包含一個(gè)名為“department”的表川无。還創(chuàng)建了另外兩個(gè)表:“databasechangelog”和“databasechangeloglock”。
databasechangelog表包含已針對(duì)數(shù)據(jù)庫(kù)運(yùn)行的所有語(yǔ)句的列表虑乖。
databasechangeloglock表用于確保兩臺(tái)計(jì)算機(jī)不會(huì)同時(shí)嘗試修改數(shù)據(jù)庫(kù)懦趋。

在項(xiàng)目中使用liquibase (spring集成的方式)

liquibase提供了對(duì)Spring的支持所以我們只需要引用對(duì)應(yīng)的jar包并進(jìn)行相關(guān)的配置就可以使用了

這里使用gradle作為示例
step1: 添加依賴

compile "org.liquibase:liquibase-core"
compile "com.github.sabomichal:liquibase-mssql"
compile "com.microsoft.sqlserver:mssql-jdbc"
testCompile "com.mattbertolini:liquibase-slf4j"

step2: 添加liquibase文件

在resource目錄下創(chuàng)建liquibase文件夾,并創(chuàng)建master.xml文件作為主文件
使用 <include file="config/liquibase/changelog/xxx.xml" relativeToChangelogFile="false"/> 目錄引入changelog文件

step3: 配置liquibase

@Bean
    public SpringLiquibase liquibase(DataSource dataSource, LiquibaseProperties liquibaseProperties) {

        SpringLiquibase liquibase = new SpringLiquibase(taskExecutor, env);
        liquibase.setDataSource(dataSource);
        //制定changelog的位置疹味,這里使用的一個(gè)master文件引用其他文件的方式
        liquibase.setChangeLog("classpath:config/liquibase/master.xml");
        liquibase.setContexts(liquibaseProperties.getContexts());
        liquibase.setDefaultSchema(liquibaseProperties.getDefaultSchema());
        liquibase.setDropFirst(liquibaseProperties.isDropFirst());
        return liquibase;
    }

liquibase會(huì)在啟動(dòng)的時(shí)候更新數(shù)據(jù)庫(kù)仅叫,可以配置為異步執(zhí)行

對(duì)現(xiàn)有數(shù)據(jù)庫(kù)應(yīng)用重構(gòu) & 常見(jiàn)的數(shù)據(jù)庫(kù)操作

隨著新特性添加到了應(yīng)用程序中,經(jīng)常需要變更數(shù)據(jù)庫(kù)的結(jié)構(gòu)或修改表約束糙捺。LiquiBase 提了超過(guò) 30 種數(shù)據(jù)庫(kù)重構(gòu)支持(參見(jiàn) 參考資料)诫咱。本節(jié)將介紹 4 種重構(gòu):添加列(Add Column)、刪除列(Drop Column)继找、創(chuàng)建表(Create Table)和操作數(shù)據(jù)遂跟。

添加列

在項(xiàng)目的開(kāi)始,幾乎不可能考慮到數(shù)據(jù)庫(kù)中的所有列婴渡。而有時(shí)候幻锁,用戶要求新的特性 —例如為存儲(chǔ)在系統(tǒng)中的信息收集更多的數(shù)據(jù) —這就要求添加新的列。清單 4 使用 LiquiBase addColumn重構(gòu)边臼,向數(shù)據(jù)庫(kù)中的 distributor表添加了一個(gè)列:

清單 4. 使用 LiquiBase 變更集中的 Add Column 數(shù)據(jù)庫(kù)重構(gòu)

<changeSet id="4" author="joe"> 
 <addColumn tableName="distributor"> 
   <column name="phonenumber" type="varchar(255)"/> 
 </addColumn> 
</changeSet>

刪除列

假如在以后幾個(gè)版本中哄尔,您想要?jiǎng)h除在清單 4 添加的 phonenumber列。只需要調(diào)用 dropColumn重構(gòu)柠并,如清單 5 所示:

刪除一個(gè)數(shù)據(jù)庫(kù)列

<dropColumn tableName="distributor" columnName="phonenumber"/>

創(chuàng)建表

向數(shù)據(jù)庫(kù)添加一個(gè)新表也是常見(jiàn)的數(shù)據(jù)庫(kù)重構(gòu)岭接。清單 6 創(chuàng)建了一個(gè)新表 distributor,定義了列臼予、約束和默認(rèn)值:

清單 6. 在 LiquiBase 中創(chuàng)建一個(gè)新數(shù)據(jù)庫(kù)表

<changeSet id="3" author="betsey"> 
 <createTable tableName="distributor"> 
   <column name="id" type="int"> 
     <constraints primaryKey="true" nullable="false"/> 
   </column> 
   <column name="name" type="varchar(255)"> 
     <constraints nullable="false"/> 
   </column> 
   <column name="address" type="varchar(255)"> 
     <constraints nullable="true"/> 
   </column> 
   <column name="active" type="boolean" defaultValue="1"/> 
 </createTable> 
</changeSet>

操作數(shù)據(jù)

在應(yīng)用了結(jié)構(gòu)性數(shù)據(jù)重構(gòu)后(例如添加列和創(chuàng)建表)鸣戴,通常需要向受重構(gòu)影響的表中插入數(shù)據(jù)。此外粘拾,可能需要修改查找表(或其他類型的表)中的現(xiàn)有數(shù)據(jù)窄锅。清單 7 展示了如何使用一個(gè) LiquiBase 變更集插入數(shù)據(jù):

清單 7. 使用一個(gè) LiquiBase 變更集插入數(shù)據(jù)

<changeSet id="3" author="betsey"> 
 <code type="section" width="100%"> 
 <insert tableName="distributor"> 
   <column name="id" valueNumeric="3"/> 
   <column name="name" value="Manassas Beer Company"/> 
 </insert> 
 <insert tableName="distributor"> 
   <column name="id" valueNumeric="4"/> 
   <column name="name" value="Harrisonburg Beer Distributors"/> 
 </insert> 
</changeSet>

您應(yīng)該編寫用于操作數(shù)據(jù)的 SQL 腳本,因?yàn)槭褂?LiquiBase XML 變更集限制很多缰雇。有時(shí)候使用 SQL 腳本向數(shù)據(jù)庫(kù)應(yīng)用大量的變更會(huì)簡(jiǎn)單一些入偷。LiquiBase 也可以支持這些情景追驴。清單 8 調(diào)用變更集中的 insert-distributor-data.sql來(lái)插入 distributor表數(shù)據(jù):

清單 8. 從 LiquiBase 變更集運(yùn)行一個(gè)定制 SQL 文件

<changeSet id="6" author="joe"> 
 <sqlFile path="insert-distributor-data.sql"/> 
</changeSet>

LiquiBase 支持很多其他數(shù)據(jù)庫(kù)重構(gòu),包括 Add Lookup Table 和 Merge Columns疏之〉钛可以使用如清單 4 到清單 8 所示的方式定義所有這些支持。

changeset xsd 參考

<!-- Children for changeSet -->
    <xsd:group name="changeSetChildren">
        <xsd:choice>
            <xsd:element ref="comment" maxOccurs="1" />
            <xsd:element ref="createTable" maxOccurs="unbounded" />
            <xsd:element ref="dropTable" maxOccurs="unbounded" />
            <xsd:element ref="createView" maxOccurs="unbounded" />
            <xsd:element ref="renameView" maxOccurs="unbounded" />
            <xsd:element ref="dropView" maxOccurs="unbounded" />
            <xsd:element ref="insert" maxOccurs="unbounded" />
            <xsd:element ref="addColumn" maxOccurs="unbounded" />
            <xsd:element ref="sql" maxOccurs="unbounded" />
            <xsd:element ref="createProcedure" maxOccurs="unbounded" />
            <xsd:element ref="dropProcedure" maxOccurs="unbounded" />
            <xsd:element ref="sqlFile" maxOccurs="unbounded" />
            <xsd:element ref="renameTable" maxOccurs="unbounded" />
            <xsd:element ref="renameColumn" maxOccurs="unbounded" />
            <xsd:element ref="dropColumn" maxOccurs="unbounded" />
            <xsd:element ref="mergeColumns" maxOccurs="unbounded" />
            <xsd:element ref="modifyDataType" maxOccurs="unbounded" />
            <xsd:element ref="createSequence" maxOccurs="unbounded" />
            <xsd:element ref="alterSequence" maxOccurs="unbounded" />
            <xsd:element ref="dropSequence" maxOccurs="unbounded" />
            <xsd:element ref="renameSequence" maxOccurs="unbounded" />
            <xsd:element ref="createIndex" maxOccurs="unbounded" />
            <xsd:element ref="dropIndex" maxOccurs="unbounded" />
            <xsd:element ref="addNotNullConstraint" maxOccurs="unbounded" />
            <xsd:element ref="dropNotNullConstraint" maxOccurs="unbounded" />
            <xsd:element ref="addForeignKeyConstraint" maxOccurs="unbounded" />
            <xsd:element ref="dropForeignKeyConstraint" maxOccurs="unbounded" />
            <xsd:element ref="dropAllForeignKeyConstraints"
                maxOccurs="unbounded" />
            <xsd:element ref="addPrimaryKey" maxOccurs="unbounded" />
            <xsd:element ref="dropPrimaryKey" maxOccurs="unbounded" />
            <xsd:element ref="addLookupTable" maxOccurs="unbounded" />
            <xsd:element ref="addAutoIncrement" maxOccurs="unbounded" />
            <xsd:element ref="addDefaultValue" maxOccurs="unbounded" />
            <xsd:element ref="dropDefaultValue" maxOccurs="unbounded" />
            <xsd:element ref="addUniqueConstraint" maxOccurs="unbounded" />
            <xsd:element ref="dropUniqueConstraint" maxOccurs="unbounded" />
            <xsd:element ref="setTableRemarks" maxOccurs="unbounded" />
            <xsd:element ref="setColumnRemarks" maxOccurs="unbounded" />
            <xsd:element ref="customChange" maxOccurs="unbounded" />
            <xsd:element ref="update" maxOccurs="unbounded" />
            <xsd:element ref="delete" maxOccurs="unbounded" />
            <xsd:element ref="loadData" maxOccurs="unbounded" />
            <xsd:element ref="loadUpdateData" maxOccurs="unbounded" />
            <xsd:element ref="executeCommand" maxOccurs="unbounded" />
            <xsd:element ref="stop" maxOccurs="unbounded" />
            <xsd:element ref="output" maxOccurs="unbounded" />
            <xsd:element ref="empty" maxOccurs="unbounded" />
            <xsd:element ref="rollback" maxOccurs="1" />
            <xsd:any namespace="##other" processContents="lax" minOccurs="0"
                maxOccurs="unbounded" />
        </xsd:choice>
    </xsd:group>

gradle liquibase 插件使用

安裝gradle插件

gradle 2.0 以上寫法

plugins {
  id 'org.liquibase.gradle' version '2.0.0'
}

gradle 2.0 以下寫法

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath "org.liquibase:liquibase-gradle-plugin:2.0.0"
    }
}
apply plugin: 'org.liquibase.gradle'

配置依賴

dependencies {
  ...
  // 選擇你需要的依賴
  liquibaseRuntime 'org.liquibase:liquibase-core:3.6.1'
  liquibaseRuntime 'org.liquibase:liquibase-groovy-dsl:2.0.0'
  liquibaseRuntime 'mysql:mysql-connector-java:5.1.34'
  ...
}

配置 liquibase activities(類似profile)

//生成對(duì)比記錄文件的位置
project.ext.diffChangelogFile = 'src/main/resources/config/liquibase/changelog/' + new Date().format('yyyyMMddHHmmss') + '_changelog.xml'
//生成sql文件的位置
project.ext.generateSql = 'src/main/resources/config/liquibase/sql/' + new Date().format('yyyyMMddHHmmss') + '_update.sql'

liquibase {
    activities {
        prod {
            driver 'com.microsoft.sqlserver.jdbc.SQLServerDriver'
            url 'jdbc:sqlserver://localhost:1433;database=damManager'
            username 'SA'
            password 'yourStrong(!)Password'
            changeLogFile 'config/liquibase/master.xml'
            defaultSchemaName ''
            logLevel 'debug'
            baseDir 'src/main/resources/'
            outputFile project.ext.generateSql
        }
        dev {
            driver 'com.microsoft.sqlserver.jdbc.SQLServerDriver'
            url 'jdbc:sqlserver://localhost:1433;database=damManager'
            username 'SA'
            password 'yourStrong(!)Password'
            password 'sql_2008dba'
            changeLogFile 'config/liquibase/master.xml'
            defaultSchemaName ''
            logLevel 'debug'
            baseDir 'src/main/resources/'
            outputFile project.ext.generateSql
        }
        diffLog {
            driver ''
            url 'jdbc:sqlserver://localhost:1433;database=damManager'
            username 'SA'
            password 'yourStrong(!)Password'
            changeLogFile project.ext.diffChangelogFile
            defaultSchemaName ''
            logLevel 'debug'
            classpath 'src/main/resources/'
        }
        runList = 'dev' // 這里代表選擇哪一個(gè)配置 可用參數(shù)代替
    }

}

入口類配置

可通過(guò)自定義入口類锋爪,拓展liquibase的功能
拓展示例項(xiàng)目地址 https://gitee.com/youngboyvip/liquibase-cmd

默認(rèn)入口類
liquibase.integration.commandline.Main

配置方法

liquibase {
  mainClassName = 'liquibase.ext.commandline.LiquibaseAlternativeMain'
}

配置完成后就可以在gradle中看到liquibase的task

注意:如果使用了include等標(biāo)簽需要注意 file="xxx/xxx/xxx.xml" 絕對(duì)路徑和相對(duì)路徑丙曙,如果設(shè)置relativeToChangelogFile="false" 這說(shuō)明你使用的是絕對(duì)路徑,true 選擇的是相對(duì)路徑其骄,可自定義資源加載器解決絕對(duì)路徑和相對(duì)路徑的問(wèn)題河泳,可以參考上方的示例項(xiàng)目

任務(wù)額外參數(shù)設(shè)置

liquibase.activities 中配置的是必須要配置的參數(shù),一些命令可能需要額外的參數(shù)年栓,這個(gè)時(shí)候就需要使用命令行動(dòng)態(tài)創(chuàng)建參數(shù)

如果使用的是gradle wrapper 需要使用gradlew 執(zhí)行命令

示例

//多個(gè)參數(shù)用空格隔開(kāi)拆挥,命令參數(shù)可參考文章下方附錄
gradlew <任務(wù)名> -PliquibaseCommandValue="--xx=yy --aa=bb"

使用經(jīng)驗(yàn)

不要手動(dòng)修改數(shù)據(jù)庫(kù)
不要去修改原來(lái)的changeset 使用新的changeset去修改
定時(shí)打tag 方便回滾

正在開(kāi)發(fā)的項(xiàng)目中使用liquibase

使用思路: 把以前的數(shù)據(jù)庫(kù)變更(比如表結(jié)構(gòu),存儲(chǔ)過(guò)程某抓,基礎(chǔ)數(shù)據(jù))導(dǎo)出來(lái)纸兔,然后使用liquibase管理,以后開(kāi)發(fā)統(tǒng)一使用liquibase數(shù)據(jù)庫(kù)管理變更)

step1: 導(dǎo)出數(shù)據(jù)庫(kù)中的更改

可以使用數(shù)據(jù)庫(kù)工具導(dǎo)出為sql文件否副,或者使用liquibase命令行工具的generateChangelog命令 導(dǎo)出XML變更文件

step2: 使用liquibase管理數(shù)據(jù)庫(kù)變更

因?yàn)閿?shù)據(jù)庫(kù)中已經(jīng)存在對(duì)應(yīng)的變更汉矿,所以只需要把導(dǎo)出來(lái)的變更記錄標(biāo)記為已執(zhí)行即可

這步操作可以使用liquibase命令行根據(jù)的changelogSyncchangelogSyncSQL 這個(gè)兩個(gè)命令的區(qū)別是一個(gè)會(huì)直接修改數(shù)據(jù)庫(kù),一個(gè)是不直接修改數(shù)據(jù)庫(kù)备禀,一個(gè)是生成對(duì)應(yīng)的sql洲拇,需要手動(dòng)指向sql

liquibase 命令附錄

命令名稱 命令描述
update 更新數(shù)據(jù)庫(kù)到當(dāng)前版本
updateSQL 寫入SQL將數(shù)據(jù)庫(kù)更新到currentversion或STDOUT
updateCount <num> 將下一個(gè)NUM更改應(yīng)用到數(shù)據(jù)庫(kù)
updateCountSQL <num> 寫入SQL以將下一個(gè)NUM更改應(yīng)用到數(shù)據(jù)庫(kù)
updateToTag <tag> 使用指定的標(biāo)記將數(shù)據(jù)庫(kù)更新到變更集
updateToTagSQL <tag> 使用指定的標(biāo)記將SQL寫入(到標(biāo)準(zhǔn)輸出)到更改集
rollback <tag> 將數(shù)據(jù)庫(kù)回滾到指定標(biāo)簽的狀態(tài)is was
rollbackSQL <tag> 生成數(shù)據(jù)庫(kù)回滾到指定標(biāo)簽的sql
rollbackToDate <date/time> 將數(shù)據(jù)庫(kù)回滾到給定日期/時(shí)間的狀態(tài)is was。日期格式:yyyy-MM-dd 'HH: mm: ss
rollbackToDateSQL <date/time> 寫入SQL以將數(shù)據(jù)庫(kù)回滾到給定日期/時(shí)間版本的狀態(tài)到STDOUT
rollbackCount <value> 回滾應(yīng)用于數(shù)據(jù)庫(kù)的最后一個(gè)<值>更改集
rollbackCountSQL <value> 寫入SQL以回滾最后一個(gè)<值>更改集到應(yīng)用于數(shù)據(jù)庫(kù)的stdoutapply
futureRollbackSQL 寫入SQL曲尸,以便在更改日志中的更改完成后將數(shù)據(jù)庫(kù)回滾到當(dāng)前狀態(tài)
futureRollbackSQL <value> 在更改日志中的<值>更改完成后赋续,寫入SQL以將數(shù)據(jù)庫(kù)回滾到當(dāng)前狀態(tài)
futureRollbackFromTagSQL <tag> 寫入(到標(biāo)準(zhǔn)輸出)SQL,以便在更改后將數(shù)據(jù)庫(kù)回滾到其當(dāng)前狀態(tài)
updateTestingRollback 更新數(shù)據(jù)庫(kù)另患,然后再次回滾更改纽乱。用于測(cè)試回滾支持
generateChangeLog 寫入更改日志XML以將數(shù)據(jù)庫(kù)的當(dāng)前狀態(tài)復(fù)制到標(biāo)準(zhǔn)輸出
snapshot 將數(shù)據(jù)庫(kù)的當(dāng)前狀態(tài)寫入標(biāo)準(zhǔn)輸出
snapshotReference 將referenceUrl數(shù)據(jù)庫(kù)的當(dāng)前狀態(tài)寫入標(biāo)準(zhǔn)輸出
Diff Commands 數(shù)據(jù)庫(kù)對(duì)比命令
diff [diff parameters] 數(shù)據(jù)庫(kù)對(duì)比命令
diffChangeLog [diff parameters] 數(shù)據(jù)庫(kù)對(duì)比日志
Documentation Commands 文檔命令
dbDoc <outputDirectory> 基于當(dāng)前數(shù)據(jù)庫(kù)和更改日志生成類似javadoc的文檔
Maintenance Commands 維護(hù)命令
tag <tag string> 給當(dāng)前的數(shù)據(jù)庫(kù)打標(biāo)簽,方便日后回滾
tagExists <tag string> 檢查對(duì)應(yīng)的標(biāo)簽是否存在
status [--verbose] 輸出為執(zhí)行changeset的行數(shù)
unexpectedChangeSets[--verbose] 輸出本地不存在changeset 行數(shù)
validate 檢查是否有錯(cuò)誤的changelog
calculateCheckSum <id> 檢查指定changeset id 的checksum值 格式為 filepath::id::author
clearCheckSums 從數(shù)據(jù)庫(kù)日志中刪除所有保存的校驗(yàn)和
changelogSync 標(biāo)記所有的更改已執(zhí)行
changelogSyncSQL 生成標(biāo)記更改已執(zhí)行的sql并輸出到標(biāo)準(zhǔn)輸出
markNextChangeSetRan 將下一個(gè)變更標(biāo)記為已執(zhí)行
markNextChangeSetRanSQL 生成將下一個(gè)變更標(biāo)記為已執(zhí)行的sql并輸出到標(biāo)準(zhǔn)輸出
listLocks 列出liquibase數(shù)據(jù)庫(kù)鎖
releaseLocks 釋放所有的liquibase數(shù)據(jù)庫(kù)鎖
dropAll 刪除數(shù)據(jù)庫(kù)表(慎用昆箕!)

必傳參數(shù)

參數(shù) 描述
--changeLogFile=<path and filename> 變更文件日志路徑
--username=<value> 數(shù)據(jù)庫(kù)用戶名
--password=<value> 數(shù)據(jù)庫(kù)密碼
--url=<value> 數(shù)據(jù)庫(kù)url

可選的參數(shù)

參數(shù) 描述
--classpath=<value> 類路徑包含遷移文件和JDBC驅(qū)動(dòng)程序
--driver=<jdbc.driver.ClassName> 數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序類名
--databaseClass=<database.ClassName> 自定義liquibase.database鸦列。Databaseimplementation使用
--propertyProviderClass=<properties.ClassName> 要使用的自定義屬性實(shí)現(xiàn)
--defaultSchemaName=<name> 要使用的默認(rèn)數(shù)據(jù)庫(kù)模式
--contexts=<value> 更改要執(zhí)行的上下文
--labels=<expression> 定義要執(zhí)行的標(biāo)簽變更集的表達(dá)式
--defaultsFile=</path/to/file.properties> 帶有默認(rèn)選項(xiàng)值的文件(默認(rèn):./liquibase.properties)
--delimiter=<string> 與executeSql命令一起使用,用于設(shè)置用于分解包含多個(gè)語(yǔ)句的文件的字符串鹏倘。
--driverPropertiesFile=</path/to/file.properties> 在要?jiǎng)?chuàng)建的JDBC連接上設(shè)置自定義屬性的文件
--changeExecListenerClass=<ChangeExecListener.ClassName> 自定義更改Execlistener實(shí)現(xiàn)以使用
--changeExecListenerPropertiesFile=</path/to/file.properties> 用于自定義更改Exec偵聽(tīng)器的屬性
--liquibaseCatalogName=<name> 帶有l(wèi)iquibase表的目錄的名稱
--liquibaseSchemaName=<name> 帶有l(wèi)iquibase表的模式的名稱
--databaseChangeLogTableName=<name> Liquibase ChangeLogtable的名稱(默認(rèn):DATABASECHANGELOG)
--databaseChangeLogLockTableName=<name> Liquibase ChangeLogLock表的名稱(默認(rèn):DATABASECHANGELOGLOCK)
--liquibaseSchemaName=<name> 帶有l(wèi)iquibase表的模式的名稱
--includeSystemClasspath=<true|false> 將系統(tǒng)類路徑包含在Liquibase類路徑中(默認(rèn):true)
--promptForNonLocalDatabase=<true|false> 如果非本地主機(jī)數(shù)據(jù)庫(kù)(默認(rèn):false)薯嗤,則提示
--logLevel=<level> 執(zhí)行日志級(jí)別(調(diào)試、信息纤泵、警告骆姐、嚴(yán)重、關(guān)閉)
--logFile=<file> 日志文件
--currentDateTimeFunction=<value> 覆蓋SQL中使用的當(dāng)前日期時(shí)間函數(shù)。適用于不受支持的數(shù)據(jù)庫(kù)
--outputDefaultSchema=<true|false> 如果為真诲锹,SQL對(duì)象引用包括模式名,甚至ifit也是默認(rèn)模式涉馅。默認(rèn)值為true
--outputDefaultCatalog=<true|false> 如果為真归园,SQL對(duì)象引用包括目錄名,甚至ifit也是默認(rèn)目錄稚矿。默認(rèn)值為true
--outputFile=<file> 為寫入輸出的命令寫入輸出的文件庸诱,例如updateSQL。如果沒(méi)有指定晤揣,則寫入sysout桥爽。
--help 打印此消息
--version 打印此版本信息

diff 命令必傳參數(shù)

參數(shù) 描述
--referenceUsername=<value> 對(duì)比數(shù)據(jù)庫(kù)用戶名
--referencePassword=<value> 對(duì)比數(shù)據(jù)庫(kù)密碼
--referenceUrl=<value> 對(duì)比數(shù)據(jù)庫(kù)url

diff 命令可選參數(shù)

參數(shù) 描述
--defaultCatalogName=<name> 默認(rèn)數(shù)據(jù)庫(kù)目錄
--defaultSchemaName=<name> 默認(rèn)數(shù)據(jù)庫(kù)模式
--referenceDefaultCatalogName=<name> 對(duì)比數(shù)據(jù)庫(kù)要使用的參考數(shù)據(jù)庫(kù)目錄
--referenceDefaultSchemaName=<name> 對(duì)比數(shù)據(jù)庫(kù)要使用的數(shù)據(jù)庫(kù)模式
--schemas=<name1,name2> 從比較中包含對(duì)象的數(shù)據(jù)庫(kù)模式
--referenceSchemas=<name1,name2> 引用數(shù)據(jù)庫(kù)模式來(lái)包含來(lái)自比較的對(duì)象,只有在與——模式不同時(shí)才需要
--outputSchemaAs=<name1,name2> 在diffChangeLog/generateChangeLog上昧识,使用這些名稱作為schemaNameinstead of the real name钠四。
--includeCatalog=<true|false> 如果為真,則在生成的變更集中將目錄默認(rèn)為false
--includeSchema=<true|false> 如果為真跪楞,模式將包含在生成的changeSetsDefaults中
--referenceDriver=<jdbc.driver.ClassName> 引用數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序類名
--dataOutputDirectory=DIR 以CSV格式輸出給定目錄中的數(shù)據(jù)
--diffTypes diff類型的列表缀去,包括inChange日志用一個(gè)逗號(hào)分隔

官方參考文檔 http://www.liquibase.org/documentation/command_line.html

Gradle 命令參考

參數(shù) 描述
-?, -h, --help 顯示幫助 - - .....
-a, --no-rebuild 忽略"項(xiàng)目依賴",假設(shè)模塊web依賴于base,采用此參數(shù)后將不再構(gòu)建base模塊,即使base模塊代碼存在更新也不會(huì)(注意:如果base模塊是clean的,那么加此參數(shù)構(gòu)建不會(huì)將base依賴構(gòu)建到項(xiàng)目中來(lái),相當(dāng)于忽略掉base依賴).
-b, --build-file 執(zhí)行指定的*.gradle文件,默認(rèn)首先會(huì)尋找當(dāng)前目錄下的 build.gradle文件或依據(jù)settings.gradle中的配置尋找子項(xiàng)目中的 build.gradle, 采用-b參數(shù)將會(huì)忽略setting文件.
-c, --settings-file 執(zhí)行指定的*.gralde文件,默認(rèn)settings.gradle.
--console 指定控制臺(tái)輸出類型,可選值有 'plain', 'auto' (默認(rèn)) , 'rich'.plain 是生成普通的文本,該選項(xiàng)禁止所有顏色和富文本輸出甸祭; auto (默認(rèn))當(dāng)構(gòu)建程序與控制臺(tái)相關(guān)聯(lián)時(shí)啟動(dòng) 顏色和富文本輸出缕碎,或者不關(guān)聯(lián)時(shí)生成普通文本;rich 啟動(dòng)顏色和富文本輸出池户,忽略構(gòu)建程序是否關(guān)聯(lián)了控制臺(tái),如果沒(méi)有關(guān)聯(lián)構(gòu)建輸出將輸出 ANSI 控制字符來(lái)生產(chǎn)富文本輸出
--no-color 取消控制臺(tái)著色效果,不過(guò)此選項(xiàng)已經(jīng)不推薦使用,推薦使用 --console=plain替代.
--continue 忽略報(bào)錯(cuò)繼續(xù)構(gòu)建,默認(rèn)報(bào)錯(cuò)后終止構(gòu)建.
-d, --debug 指定日志輸出級(jí)別為debug,可打印一般堆棧信息.
-q, --quiet 指定日志輸出形式為安靜模式,只打印errors.
-i, --info 指定日志級(jí)別為info.
-S, --full-stacktrace 指定日志級(jí)別為full-stacktrace,打印完整堆棧異常信息,超長(zhǎng)超多.
-s, --stacktrace 指定日志級(jí)別為stacktrace,會(huì)打印所有堆棧異常信息.
-D, --system-prop -D屬性會(huì)被傳送給啟動(dòng)Gradle的jvm咏雌,作為一個(gè)系統(tǒng)屬性被jvm使用(例如:-Dname=tom).
-P, --project-prop 設(shè)置Gradle的項(xiàng)目參數(shù),會(huì)被直接加載到Gradle領(lǐng)域?qū)ο笊?例如:-Pversion=1.2).
--configure-on-demand 只在構(gòu)建中應(yīng)用項(xiàng)目相關(guān)配置Only relevant projects are configured in this build run. This means faster build for large multi-builds. [incubating]
--daemon 使用Gradle守護(hù)進(jìn)程執(zhí)行構(gòu)建,如果沒(méi)有守護(hù)進(jìn)程則啟動(dòng)一個(gè)守護(hù)進(jìn)程.
--no-daemon 禁用守護(hù)進(jìn)程,不使用守護(hù)進(jìn)程執(zhí)行構(gòu)建.
--stop 如果存在守護(hù)進(jìn)程,那么終止它.
--foreground 以foreground形式啟動(dòng)守護(hù)進(jìn)程.
-g, --gradle-user-home 指定默認(rèn)的指定Gradle 用戶home 目錄.默認(rèn)在"用戶目錄/.gradle".
--gui 運(yùn)行Gradle GUI圖形界面程序.
-I, --init-script 執(zhí)行指定init腳本,這個(gè)腳本會(huì)在build之前執(zhí)行.會(huì)按照當(dāng)前目錄,USER_HOME/.gradle/ ,USER_HOME/.gradle/init.d/,GRADLE_HOME/init.d/的順序?qū)ふ襥nit.gradle文件
-m, --dry-run 模擬任務(wù)執(zhí)行過(guò)程并將過(guò)程打印出來(lái),并非真正執(zhí)行,只是為了讓你知道會(huì)執(zhí)行哪些步驟.
--max-workers 指定采用幾個(gè)CPU核心執(zhí)行構(gòu)建/
--offline 采用離線模式構(gòu)建項(xiàng)目,當(dāng)然如果你的gav中存在+,當(dāng)心構(gòu)建失敗.
-p, --project-dir 指定build.gradle腳本所在目錄,默認(rèn)為當(dāng)前目錄.可以通過(guò)此參數(shù)指定子項(xiàng)目目錄后,默認(rèn)會(huì)執(zhí)行指定目錄下的build.gradle文件.
--parallel 采用并行模式運(yùn)行
--parallel-threads 并行構(gòu)建執(zhí)行采用的線程數(shù),不過(guò)已經(jīng)棄用,推薦采用--parallel --max-workers替代.
--profile 存儲(chǔ)一份執(zhí)行報(bào)告到<build_dir>/reports/profile,包括總時(shí)間和在配置和任務(wù)執(zhí)行階段的細(xì)節(jié)。并以時(shí)間大小倒序排列校焦,并且記錄了任務(wù)的執(zhí)行情況.Gradle會(huì)根據(jù)構(gòu)建時(shí)間命名這些報(bào)告文件.
--project-cache-dir 指定項(xiàng)目緩存目錄,默認(rèn)在項(xiàng)目根目錄下的.gradle文件夾.
--recompile-scripts 會(huì)丟棄緩存的腳本,然后重新編譯此腳本并將其存在緩存中.通過(guò)這種方式可以強(qiáng)制 Gradle 重新生成緩存.
--refresh-dependencies 強(qiáng)制刷新依賴,忽略緩存重新下載
--rerun-tasks 強(qiáng)制重新執(zhí)行任務(wù),忽略任務(wù)緩存,默認(rèn)情況下是增量構(gòu)建
-t, --continuous 連續(xù)構(gòu)建模式,采用此模式后會(huì)監(jiān)聽(tīng)所有構(gòu)建文件變化,文件發(fā)生變化后會(huì)自動(dòng)重新構(gòu)建
-u, --no-search-upward 不應(yīng)用父目錄中的ettings.gradle文件,如果不添加此項(xiàng),父目錄的setting.gradle會(huì)覆蓋子目錄下的配置.
-v, --version 打印gradle版本信息.
-x, --exclude-task 任務(wù)排除,跳過(guò)執(zhí)行指定任務(wù).
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末赊抖,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子寨典,更是在濱河造成了極大的恐慌熏迹,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凝赛,死亡現(xiàn)場(chǎng)離奇詭異注暗,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)墓猎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門捆昏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人毙沾,你說(shuō)我怎么就攤上這事骗卜。” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵寇仓,是天一觀的道長(zhǎng)举户。 經(jīng)常有香客問(wèn)我,道長(zhǎng)遍烦,這世上最難降的妖魔是什么俭嘁? 我笑而不...
    開(kāi)封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮服猪,結(jié)果婚禮上供填,老公的妹妹穿的比我還像新娘。我一直安慰自己罢猪,他們只是感情好近她,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著膳帕,像睡著了一般粘捎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上危彩,一...
    開(kāi)封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天晌端,我揣著相機(jī)與錄音,去河邊找鬼恬砂。 笑死咧纠,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的泻骤。 我是一名探鬼主播漆羔,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼狱掂!你這毒婦竟也來(lái)了演痒?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤趋惨,失蹤者是張志新(化名)和其女友劉穎鸟顺,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體器虾,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡讯嫂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了兆沙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片欧芽。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖葛圃,靈堂內(nèi)的尸體忽然破棺而出千扔,到底是詐尸還是另有隱情憎妙,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布曲楚,位于F島的核電站厘唾,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏龙誊。R本人自食惡果不足惜抚垃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望载迄。 院中可真熱鬧,春花似錦抡蛙、人聲如沸护昧。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)惋耙。三九已至,卻和暖如春熊昌,著一層夾襖步出監(jiān)牢的瞬間绽榛,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工婿屹, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留灭美,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓昂利,卻偏偏與公主長(zhǎng)得像届腐,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蜂奸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 關(guān)于Mongodb的全面總結(jié) MongoDB的內(nèi)部構(gòu)造《MongoDB The Definitive Guide》...
    中v中閱讀 31,905評(píng)論 2 89
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,749評(píng)論 25 707
  • 用兩張圖告訴你犁苏,為什么你的 App 會(huì)卡頓? - Android - 掘金 Cover 有什么料? 從這篇文章中你...
    hw1212閱讀 12,699評(píng)論 2 59
  • 2002年從湘雅醫(yī)學(xué)院畢業(yè)后扩所,從事醫(yī)務(wù)一線臨床工作的時(shí)間并不多围详,而后工作內(nèi)容為教育行業(yè)和服務(wù)青少年工作,故工作對(duì)象...
    陌上初薰時(shí)閱讀 166評(píng)論 0 1
  • 同學(xué)聚會(huì)的口號(hào)是“青春不散場(chǎng) ”...看了一晚的紀(jì)念相冊(cè)祖屏,斗膽把那部神劇主題曲的歌詞改了... 《青春不散場(chǎng)》 看...
    依嵐聽(tīng)雪閱讀 355評(píng)論 2 5