數(shù)據(jù)庫(kù)開發(fā)升級(jí)變更技術(shù)探究(數(shù)據(jù)庫(kù)升級(jí)和配置變更前)
【Liquibase】
Liquibase是一個(gè)獨(dú)立于數(shù)據(jù)庫(kù)的開源庫(kù),用于跟蹤、管理和部署數(shù)據(jù)庫(kù)設(shè)計(jì)的變化。它發(fā)布于2006年,旨在更容易跟蹤數(shù)據(jù)庫(kù)的變化,特別適合在敏捷軟件開發(fā)環(huán)境中使用。
概述
對(duì)數(shù)據(jù)庫(kù)的所有更改都存儲(chǔ)在文本文件(XML、YAML、JSON或SQL)中,并通過(guò)?"id "和?"author "標(biāo)簽以及文件本身的名稱來(lái)識(shí)別。在每個(gè)數(shù)據(jù)庫(kù)中都存儲(chǔ)了一個(gè)含有所有部署的更改列表,在數(shù)據(jù)庫(kù)更新時(shí)都會(huì)被查閱,以確定需要部署哪些新的更改。?有一個(gè)特點(diǎn)要注意,這種方法不是用版本號(hào)來(lái)管理數(shù)據(jù)庫(kù)設(shè)計(jì)變化,因此沒有數(shù)據(jù)庫(kù)的版本號(hào),但這種方法允許多個(gè)開發(fā)人員和多個(gè)代碼分支的協(xié)同工作。
Liquibase在第一次執(zhí)行changeLog文件時(shí),會(huì)自動(dòng)創(chuàng)建DatabaseChangeLog表和DatabaseChangeLogLock表。
主要功能
l??30多個(gè)內(nèi)置數(shù)據(jù)庫(kù)重構(gòu)器
l??可擴(kuò)展性,創(chuàng)建自定義更改
l??將數(shù)據(jù)庫(kù)更新為當(dāng)前版本
l??回滾到數(shù)據(jù)庫(kù)中的最后X次修改
l??回滾數(shù)據(jù)庫(kù)更改到特定日期/時(shí)間
l??回滾數(shù)據(jù)庫(kù)到?"標(biāo)簽"
l??可以保存數(shù)據(jù)庫(kù)更新和回滾的SQL,以便手動(dòng)查看。
l??獨(dú)立的IDE和Eclipse插件
l??用于包括/排除要執(zhí)行的更改集的上下文
l??數(shù)據(jù)庫(kù)差異報(bào)告
l??數(shù)據(jù)庫(kù)差異變化記錄的生成
l??能夠創(chuàng)建變更日志進(jìn)而生成現(xiàn)有數(shù)據(jù)庫(kù)的能力。
l??數(shù)據(jù)庫(kù)變更文檔的生成
l??DBMS檢查、用戶檢查和SQL檢查的前提條件
l??能夠?qū)⒆兏罩痉指畛啥鄠€(gè)文件,便于管理。
l??可通過(guò)命令行、Apache Ant、Apache Maven、servlet容器或Spring框架執(zhí)行。
l??支持10個(gè)數(shù)據(jù)庫(kù)系統(tǒng)
商業(yè)版
Datical既是Liquibase項(xiàng)目的最大貢獻(xiàn)者,也是Datical DB的開發(fā)者,Datical DB是一個(gè)提供Liquibase核心功能和附加功能的商業(yè)產(chǎn)品。
l??變更預(yù)測(cè)。預(yù)測(cè)即將執(zhí)行的變化,在運(yùn)行之前就預(yù)測(cè)即將執(zhí)行的變化,以確定這些變化將如何影響你的數(shù)據(jù)。
l??規(guī)則引擎來(lái)執(zhí)行企業(yè)標(biāo)準(zhǔn)和策略。
l??支持?jǐn)?shù)據(jù)庫(kù)的存儲(chǔ)邏輯:函數(shù)、存儲(chǔ)過(guò)程、包、表空間、觸發(fā)器、序列、用戶定義的類型、同義詞等。
l??比較數(shù)據(jù)庫(kù),可以對(duì)兩個(gè)數(shù)據(jù)庫(kù)設(shè)計(jì)定義進(jìn)行比較,以識(shí)別變更,并輕松地將其移動(dòng)到變更日志中。
l??變更集向?qū)В詳?shù)據(jù)庫(kù)中立的方式輕松定義和捕獲數(shù)據(jù)庫(kù)變更。
l??部署計(jì)劃向?qū)В糜诮:凸芾砟倪壿嫴渴鸸ぷ髁鞒獭?/p>
l??Jenkins、Bamboo、UrbanCode、CA Release Automation (Nolio)、Serena Release Automation、BMC Bladelogic、Puppet、Chef、以及所有流行的源碼控制系統(tǒng)如SVN、Git、TFS、CVS等的插件。
使用Datical DB的人員包括DBA、發(fā)布經(jīng)理、DevOps團(tuán)隊(duì)、應(yīng)用程序所有者、架構(gòu)師以及參與應(yīng)用程序發(fā)布過(guò)程的開發(fā)人員。它以程序化的方式管理數(shù)據(jù)庫(kù)設(shè)計(jì)變化和部署程序代碼,消除了錯(cuò)誤和延遲,實(shí)現(xiàn)了快速敏捷發(fā)布。Datical DB建立在Liquibase數(shù)據(jù)模型方法的基礎(chǔ)上,在應(yīng)用程序版本從開發(fā)到測(cè)試到生產(chǎn)環(huán)境的過(guò)程中,管理數(shù)據(jù)結(jié)構(gòu)的特定內(nèi)容。在部署之前,Datical可以在任何環(huán)境中預(yù)覽設(shè)計(jì)變化的影響,從而降低了風(fēng)險(xiǎn),使應(yīng)用程序的變化更加順暢和快速。
Liquibase開發(fā)人員Nathan Voxland是Datical公司的高管。
【使用案例】
添加依賴
數(shù)據(jù)庫(kù)變更日志文件樣本
xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.4.xsd">
在上面這個(gè)簡(jiǎn)單例子中,我們?cè)诒砀駏ser中添加一個(gè)新的字段nickeName。
用?"Spring Bean"運(yùn)行Liquibase
我們?cè)趹?yīng)用程序啟動(dòng)時(shí)部署更改的第一個(gè)選擇是通過(guò)Spring bean。當(dāng)然,還有很多其他的方法,但如果我們要使用Spring框架的話,這是個(gè)很好的而且簡(jiǎn)單的方法。
@Bean
public?SpringLiquibase?liquibase()?{
SpringLiquibase?liquibase?=?new?SpringLiquibase();
liquibase.setChangeLog("classpath:liquibase-changeLog.xml");
liquibase.setDataSource(dataSource());
return?liquibase;
}
注意:?我們將其指向一個(gè)在classpath上存在的有效的changeLog文件。
如果使用的是Spring Boot
如果你使用的是Spring Boot,就不需要為L(zhǎng)iquibase定義一個(gè)Bean。
你只需要將你的變更日志放到:
"db/changelog/db.changelog-master.yaml "中,Liquibase的更改部署就會(huì)在啟動(dòng)時(shí)自動(dòng)運(yùn)行。
需要注意的是:
l??你需要添加?"liquibase-core "依賴。
l??你可以使用?"liquibase.change-log "屬性來(lái)更改默認(rèn)的日志文件,例如:
liquibase.change-log=classpath:liquibase-changeLog.xml
在Spring Boot中禁用Liquibase
有時(shí),我們可能需要在啟動(dòng)時(shí)禁用Liquibase遷移的執(zhí)行。
我們最簡(jiǎn)單的方法是使用?spring.liquibase.enabled?屬性。這樣一來(lái),所有剩下的Liquibase配置就不會(huì)被觸動(dòng)。
下面是Spring Boot 2的例子:
spring.liquibase.enabled=false
對(duì)于?Spring Boot 1.x,我們需要使用?liquibase.enabled?屬性。
liquibase.enabled=false
使用Maven插件生成變更記錄
我們可以使用Liquibase Maven插件來(lái)生成一個(gè)變更記錄文件,而不是手動(dòng)編寫記錄文件,這樣可以節(jié)省很多工作。
我們可以使用該插件從現(xiàn)有的數(shù)據(jù)庫(kù)中生成一個(gè)變更記錄。
mvn liquibase:generateChangeLog
以下是liquibase的屬性配置:
url=jdbc:xxxx
username=xxx
password=xxx
driver=x.Driver
outputChangeLogFile=src/main/resources/liquibase-outputChangeLog.xml
最終的結(jié)果是一個(gè)changeLog文件,我們可以用它來(lái)創(chuàng)建一個(gè)初始DB設(shè)計(jì)定義或填充數(shù)據(jù)。下面是我們的示例的樣子:
我們可以使用插件從兩個(gè)現(xiàn)有數(shù)據(jù)庫(kù)(例如:開發(fā)數(shù)據(jù)庫(kù)和生產(chǎn)數(shù)據(jù)庫(kù))之間的差異生成一個(gè)變更記錄文件。
mvn liquibase:diff
下面是屬性配置:
changeLogFile=src/main/resources/liquibase-changeLog.xml
url=jdbc:xxxxxx
username=xxxx
password=xxxx
driver=xxxxx.Driver
referenceUrl=jdbc:xxxxx
diffChangeLogFile=src/main/resources/liquibase-diff-changeLog.xml
referenceDriver=xxxxx
referenceUsername=xxx
referencePassword=xxx
下面是生成的變更記錄的片段:
這是一個(gè)超級(jí)強(qiáng)大的方法來(lái)進(jìn)化你的數(shù)據(jù)庫(kù),例如,允許Hibernate自動(dòng)生成一個(gè)新的設(shè)計(jì)定義來(lái)進(jìn)行開發(fā),然后用它作為參考點(diǎn)來(lái)對(duì)照舊的設(shè)計(jì)定義。
使用Liquibase Hibernate插件
如果應(yīng)用程序使用Hibernate,我們來(lái)看一個(gè)非常有用的生成變更記錄的方法。
首先,讓我們把新插件配置好,并使用正確的依賴關(guān)系。
現(xiàn)在,有趣的部分來(lái)了。我們可以使用這個(gè)插件從現(xiàn)有正式數(shù)據(jù)庫(kù)(例如生產(chǎn)數(shù)據(jù)庫(kù))和我們的開發(fā)實(shí)體數(shù)據(jù)的差異中生成一個(gè)變更記錄文件。
因此,為了使事情變得簡(jiǎn)單,一旦修改了一個(gè)實(shí)體,你可以簡(jiǎn)單地對(duì)照舊的DB設(shè)計(jì)定義生成修改,從而獲得一個(gè)干凈而又強(qiáng)大的方式來(lái)進(jìn)化你在生產(chǎn)數(shù)據(jù)庫(kù)中的設(shè)計(jì)定義。
以下是liquibase的屬性:
changeLogFile=classpath:liquibase-changeLog.xml
url=jdbc:xxxxx
username=xxxx
password=xxx
driver=xxxx
referenceUrl=hibernate:xxxx
?dialect=org.hibernate.dialect.MySQLDialect
diffChangeLogFile=src/main/resources/liquibase-diff-changeLog.xml
注意:referenceUrl使用的是包掃描,所以需要方言參數(shù)。
【官方網(wǎng)站】
http://www.liquibase.org/
【最新版本】
3.8.7于2020年2月24日
【License】
Apache License 2.0
【Flyway】
Flyway是一個(gè)開源的數(shù)據(jù)庫(kù)升級(jí)遷移工具。
Flyway?基于七個(gè)基本命令:遷移、清理、信息、驗(yàn)證、撤銷、基線和修復(fù)。
遷移可以用SQL(支持特定數(shù)據(jù)庫(kù)的語(yǔ)法,如PL/SQL、T-SQL等)或Java(用于高級(jí)數(shù)據(jù)轉(zhuǎn)換或處理LOB)。
它有一個(gè)命令行客戶端,一個(gè)用于在應(yīng)用程序啟動(dòng)時(shí)遷移數(shù)據(jù)庫(kù)的Java API(也適用于Android),一個(gè)Maven插件和一個(gè)Gradle插件。
插件支持包括Spring Boot、Dropwizard、Grails、Play、SBT、Ant、Griffon、Grunt、Ninja等。
支持的數(shù)據(jù)庫(kù)包括Oracle、SQL Server、DB2、MySQL(包括Amazon RDS、Aurora MySQL、MariaDB)、Percona XtraDB、PostgreSQL(包括Amazon RDS和Heroku)、Aurora PostgreSQL、CockroachDB、Redshift、Informix、H2、Hsql、Derby、SQLite、SAP HANA、Sybase ASE、Phoenix和Firebird。
業(yè)內(nèi)影響
僅在2018年,F(xiàn)lyway就獲得了1150萬(wàn)次下載。
2015年1月,F(xiàn)lyway被列入了Thoughtworks科技雷達(dá)的?"推薦使用"板塊,
2019年7月,F(xiàn)lyway被Redgate收購(gòu)。
Flyway是如何工作的
Flyway通過(guò)添加一張記賬表來(lái)記錄和跟蹤變更是否被部署,何時(shí)被部署,由誰(shuí)部署。這張表還會(huì)記錄部署校驗(yàn)和,以及是否部署成功。
該框架執(zhí)行以下步驟以適應(yīng)不斷變化的數(shù)據(jù)庫(kù)設(shè)計(jì)定義:
l??檢查一個(gè)數(shù)據(jù)庫(kù)設(shè)計(jì)定義,以定位其元數(shù)據(jù)表(默認(rèn)情況下是SCHEMA_VERSION)。如果元數(shù)據(jù)表不存在,它將創(chuàng)建一個(gè)
l??掃描應(yīng)用程序的classpath,以尋找可用的變更。
l??根據(jù)元數(shù)據(jù)表比較變更情況。如果版本號(hào)低于或等于標(biāo)記為當(dāng)前版本,則會(huì)被忽略。
l??將任何剩余的變更標(biāo)記為待處理的變更。根據(jù)版本號(hào)進(jìn)行排序,并按順序執(zhí)行。
l??隨著每次變更的部署,元數(shù)據(jù)表也會(huì)相應(yīng)地更新
Flyway?支持以下基本命令來(lái)管理數(shù)據(jù)庫(kù)遷移:
Info:?打印數(shù)據(jù)庫(kù)模式的當(dāng)前狀態(tài)/版本。它打印出哪些變更正在等待中,哪些變更已經(jīng)被部署,應(yīng)用的變更狀態(tài)以及何時(shí)部署的。
Migrate:將數(shù)據(jù)庫(kù)設(shè)計(jì)定義變更到當(dāng)前版本。它掃描classpath以尋找可用的變更,并部署待處理的變更。
Baseline:對(duì)現(xiàn)有數(shù)據(jù)庫(kù)進(jìn)行基準(zhǔn)化,不包括遷移,包括基準(zhǔn)線版本?;鶞?zhǔn)線設(shè)定以后有助于在現(xiàn)有數(shù)據(jù)庫(kù)中實(shí)行增量變更,即可以正常部署較新的變更。
Validate:?根據(jù)可用的變更來(lái)驗(yàn)證當(dāng)前的數(shù)據(jù)庫(kù)模式。
Repair:?修復(fù)元數(shù)據(jù)表。
Clean:丟棄已配置設(shè)計(jì)定義中的所有對(duì)象。所有數(shù)據(jù)庫(kù)對(duì)象都會(huì)被丟棄。因此,不要在任何生產(chǎn)環(huán)境數(shù)據(jù)庫(kù)中使用clean。
【使用案例】
插件安裝配置
這個(gè)插件有四種配置方法:
flyway.url=XXX
flyway.user=XXX
flyway.password=XXX
flyway.schemas=schemaName
默認(rèn)的配置文件名稱是flyway.properties,它應(yīng)該和pom.xml文件位于同一目錄下。編碼由flyway.encoding指定(默認(rèn)為UTF-8)。
如果您使用任何其他名稱(如?customConfig.properties)作為配置文件,那么在調(diào)用?Maven?命令時(shí)應(yīng)該明確指定它。
mvn -Dflyway.configFile=customConfig.properties
最后,在命令行中調(diào)用Maven時(shí),所有的配置屬性也可以指定為系統(tǒng)屬性:
mvn -Dflyway.url=databaseUrl ?-Dflyway.user=databaseUser -Dflyway.password=databasePassword
-Dflyway.schemas=schemaName
以下是當(dāng)一個(gè)配置以多種方式指定時(shí)的優(yōu)先順序:
1.??????系統(tǒng)屬性
2.??????外部配置文件
3.??????Maven屬性
4.??????插件配置
定義第一次遷移
Flyway?遵循以下變更腳本的命名規(guī)則:
其中:
l??
l??flyway.sqlMigrationPrefix屬性配置。
l??
l??
比如:?V1_1_0__my_first_migration.sql
接下來(lái),讓我們?cè)?PROJECT_ROOT中創(chuàng)建一個(gè)目錄db/migration,用一個(gè)名為V1_0__create_employee_schema.sql的變更腳本來(lái)創(chuàng)建雇員表,其中包含SQL指令。
CREATE?TABLE?IF?NOT?EXISTS?`employee`?(
`id`?int?NOT?NULL?AUTO_INCREMENT?PRIMARY?KEY,
`name`?varchar(20),
`email`?varchar(50),
`date_of_birth`?timestamp
)ENGINE=InnoDB?DEFAULT?CHARSET=UTF8;
執(zhí)行變更
接下來(lái),我們從$PROJECT_ROOT中調(diào)用以下Maven命令來(lái)執(zhí)行數(shù)據(jù)庫(kù)變更:
mvn clean flyway:migrate -Dflyway.configFile=myFlywayConfig.properties
第一次成功變更成功以后,數(shù)據(jù)庫(kù)設(shè)計(jì)定義應(yīng)該是如下的樣子:
employee:
+----+------+-------+---------------+
| id | name | email | date_of_birth |
+----+------+-------+---------------+
我們可以重復(fù)上述設(shè)計(jì)定義和執(zhí)行步驟來(lái)做更多的變更。
定義和執(zhí)行第二次變更
讓我們通過(guò)創(chuàng)建第二個(gè)變更文件,名稱為
V2_0_create_department_schema.sql,包含兩條語(yǔ)句,來(lái)看看第二個(gè)遷移是什么樣子的。
CREATE?TABLE?IF?NOT?EXISTS?`department`?(
`id`?int?NOT?NULL?AUTO_INCREMENT?PRIMARY?KEY,
`name`?varchar(20)
)ENGINE=InnoDB?DEFAULT?CHARSET=UTF8;
ALTER?TABLE?`employee`?ADD?`dept_id`?int?AFTER?`email`;
我們執(zhí)行類似的變更命令。而現(xiàn)在,我們的數(shù)據(jù)庫(kù)模式發(fā)生了變化,為雇員表增加了一個(gè)新的列和一個(gè)新的部門表。
employee:
+----+------+-------+---------+---------------+
| id | name | email | dept_id | date_of_birth |
+----+------+-------+---------+---------------+
department:
+----+------+
| id | name |
+----+------+
我們現(xiàn)在可以通過(guò)調(diào)用下面的Maven命令來(lái)驗(yàn)證這兩個(gè)變更是成功的:
mvn flyway:info -Dflyway.configFile=myFlywayConfig.properties
禁用Spring Boot中的Flyway
有時(shí),我們可能需要在某些情況下禁用Flyway變更。
例如,在測(cè)試過(guò)程中,從實(shí)體生成數(shù)據(jù)庫(kù)設(shè)計(jì)定義是一種常見的做法,遇到這種情況,我們可以在測(cè)試配置文件下禁用Flyway。
讓我們來(lái)看看Spring Boot中的做法有多簡(jiǎn)單。
我們需要做的就是在application-test.properties文件中設(shè)置
flyway.enabled屬性。
flyway.enabled=false
在最新版本的Spring Boot中,該屬性已被更改為?spring.flyway.enabled。
spring.flyway.enabled=false
如果我們只想在啟動(dòng)時(shí)禁用Flyway自動(dòng)變更,但仍能手動(dòng)觸發(fā)變更,那么使用上述屬性并不是一個(gè)好的選擇。
這是因?yàn)樵谶@種情況下,Spring Boot?不會(huì)再自動(dòng)配置?Flyway。因此,我們必須自己提供,這不是很方便。
為了實(shí)現(xiàn)這樣的需求,我們可以啟用Flyway,同時(shí)實(shí)現(xiàn)一個(gè)空的FlywayMigrationStrategy配置類:
@Configuration
public?class?EmptyMigrationStrategyConfig?{
@Bean
public?FlywayMigrationStrategy?flywayMigrationStrategy()?{
return?flyway?->?{
//?do?nothing
};
}
}
這樣做會(huì)在應(yīng)用程序啟動(dòng)時(shí)禁用Flyway遷移,同時(shí)我們?nèi)匀豢梢允謩?dòng)觸發(fā)變更。
@RunWith(SpringRunner.class)
@SpringBootTest
public?class?ManualFlywayMigrationIntegrationTest?{
@Autowired
private?Flyway?flyway;
@Test
public?void?skipAutomaticAndTriggerManualFlywayMigration()?{
flyway.migrate();
}
}
【官方網(wǎng)站】
https://flywaydb.org/
【最新版本】
6.4.0于2020年4月21日
【License】
Apache License 2.0
【小結(jié)】
本文對(duì)于數(shù)據(jù)庫(kù)相關(guān)的設(shè)計(jì)定義及其在開發(fā)過(guò)程中常用的工具做了一番介紹,希望對(duì)現(xiàn)有或者以后的業(yè)務(wù)開發(fā)提供幫助和借鑒。
數(shù)據(jù)庫(kù)
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。