官方文檔
https://docs.liquibase.com/tools-integrations/maven/home.html通過liquibase使用mysql
https://docs.liquibase.com/workflows/database-setup-tutorials/mysql.html?Highlight=mysql 首先在pom.xml中引入liquibase的依賴<dependency> <groupId>org.liquibase</groupId> <artifactId>liquibase-core</artifactId> </dependency>
--driver=com.mysql.cj.jdbc.Driver --classpath=mysql-connector-java-8.0.22.jar --url="jdbc:mysql://bj-cdb-nivnaury.sql.tencentcdb.com:60991/lianmai?autoReconnect=true&useSSL=FALSE" --changeLogFile=db.changelog-1.0.xml --username=*****--password=*****
注冊mysql驅動
liquibase.properties的配置類比如下
driver=com.mysql.cj.jdbc.Driver classpath=mysql-connector-java-8.0.22.jar url=jdbc:mysql://bj-cdb-nivnaury.sql.tencentcdb.com:*/lianmai?autoReconnect=true&useSSL=FALSE changeLogFile=src/main/resources/db/changelog/dbChangeLog.xml outputChangeLogFile=src/main/resources/db/changelog/outputChangeLog.xml username=* password=*
生成changelog命令
https://docs.liquibase.com/commands/community/generatechangelog.html?Highlight=generateChangeLog踩坑過程
首先要配置propertyFile屬性,下面是我的目錄結構以及propertyFile的屬性配置
<plugin> <groupId>org.liquibase</groupId> <artifactId>liquibase-maven-plugin</artifactId> <configuration> <propertyFile>src/main/resources/liquibase.properties</propertyFile> </configuration> </plugin>
然后需要在liquibase.properties中配置outputChangeLogFile屬性
我們通過 execute maven goal 來執行 liquibase指令
點擊上圖圖標后回車執行
剛開始url這塊,冒號沒有去掉,執行 mvn liquibase:generateChangeLog 指令出現了以下這種錯誤
國外有個老哥犯了同樣的錯誤,https://stackoverflow.com/questions/49053509/ms-sql-liquibase-connection-could-not-be-created
然后outputChangeLogFile文件位置配置錯誤,執行指令出現了下面這種報錯
然后修改文件路徑,需要注意這個路徑是從src開始的,不是從properties的當前目錄開始的
正確的配置應該是
outputChangeLogFile=src/main/resources/db/changelog/outputChangeLog.xml
然后彈框確認是否繼續執行
最后文件中的結果如下所示
下圖是數據庫中的Persons表
如果我們要去修改這個數據庫就需要用到changeLogFile
通過liquibase update命令使用changeLogFile文件更新數據庫
修改changeLog的路徑
然后可以在changelog中建表
- 將changeset添加到變更日志。
- changeset由author和id屬性唯一標識。
- Liquibase嘗試執行事務中在最后提交的每個changeset。
<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>
CREATE TABLE "department" ("id" number (*,0), "name" VARCHAR2 (50 BYTE), "active" NUMBER (1, 0) DEFAULT 1 );
我們去數據庫看一下 create table
至此,更新數據庫功能完好
DatabaseChangeLog 和 DatabaseChangeLogLock
我們show一下table DatabaseChangeLog
select一下,會發現這個表記錄的是每次update的變更集以及用戶和時間等相關信息,用來更新和回滾
再show一下table DatabaseChangeLogLock
看下官網
Liquibase使用DATABASECHANGELOGLOCK表來確保一次只運行一個Liquibase實例。 因為Liquibase只是從DATABASECHANGELOG表中讀取數據以確定需要運行哪些變更集
所以如果對同一個數據庫同時執行多個Liquibase實例,則會發生沖突。
如果多個開發人員使用同一個數據庫實例,或者集群中有多個服務器在啟動時自動運行Liquibase,則可能發生這種情況。
所以這個表是用來鎖數據庫的,避免多個開發人員同一時刻操作數據庫的時候造成沖突 下圖是四個字段的用途
id和locked好理解,lockgranted指的是鎖庫日期,lockedby指的是被誰鎖定
回滾 maven Rollback
官方地址 https://docs.liquibase.com/tools-integrations/maven/commands/maven-rollback.html?Highlight=rollback 三種回滾模式liquibase.rollbackCount- 按順序還原指定數量的變更集,從最新的變更開始,向后操作,直到達到指定的值liquibase.rollbackTag- 還原被標記的數據庫所做的所有更改liquibase.rollbackDate- 恢復數據庫所做的所有更改到指定的日期和時間
mvn liquibase:rollback -Dliquibase.rollbackCount=3
mvn liquibase:rollback -Dliquibase.rollbackTag=version1
<liquibase.tag>v3.2.1</liquibase.tag>
<liquibase.rollbackTag>${liquibase.tag}</liquibase.rollbackTag>
mvn liquibase:rollback -Dliquibase.rollbackDate=2020-11-26
