轉(zhuǎn)載自www.youngboy.vip
使用 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ù)的changelogSync
或changelogSyncSQL
這個(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ù). |