日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

一文詳解Liquibase如何自動化數據庫腳本部署

 

作者丨Rafal Grzegorczyk

譯者丨陳駿

策劃丨孫淑娟

【51CTO.com原創稿件】您是否還在手動對數據庫執行各種腳本?您是否還在浪費時間去驗證數據庫腳本的正確性?您是否還需要將腳本合并到某個文件中,以便在每個環境中執行?在面對部署錯誤時,您是否需要花費數小時去查看數據庫的更改,以定位原因?

如今,大多數組織都已經在其應用程序中實施了DevOps的CI/CD流程。不過,其數據庫的自動化改造似乎尚未跟上時代。為此,我將向您介紹一種能夠實現自動化腳本部署的數據庫產品--Liquibase。

Liquibase的基本特點

  • 自動化數據庫的部署腳本。
  • 以相同的方式部署到不同的環境中。
  • 能夠為每次數據庫的更改準備好回滾。
  • 能夠將部署的所有詳細信息集中到一處。
  • 最少化的部署錯誤。
  • 方便開發人員針對相同的數據庫,進行高效的協同編程。
  • 審核逐個更改(請參考下圖)。
一文詳解Liquibase如何自動化數據庫腳本部署

 

下面,我將向您展示如何使用Liquibase和Git在Pretius上,自動化數據庫的更改過程。

什么是Liquibase?

Liquibase(簡稱LB)是一個用JAVA編寫的開源工具。它以用戶熟悉的格式定義了數據庫接口,并能夠自動生成特定于數據庫的SQL。例如,它將數據庫的更改(每一次更改可稱為一個更改集)放入被稱為changelog的文件中進行管理。通常,Liquibase在數據庫架構中會自動創建兩張表:

  • DATABASECHANGELOG — 存儲有關數據庫所有更改信息的表。
  • DATABASECHANGELOGLOCK — 用于防止用戶同時對數據庫進行更改。

我將在下面示例中,基于SQL編寫變更集,以實現對Oracle數據庫的自動化更改過程。

從安裝Liquibase開始

請通過鏈接
https://www.liquibase.org/download,選擇“僅文件(Just the files)”的方式,下載Liquibase的最新版本。在本文中,我將使用版本:4.3.0 build 09.02.2021。

在將其zip文件夾解壓縮后,您必須將新的路徑變量(New Path System Variable)設置為計算機上的liquibase-version#bin文件夾。同時,為了使Liquibase正常工作,您還必須安裝Java。

通過在CLI工具(在此,我使用的是Visual Studio Code)輸入:Liquibase—version,您將能看到:

一文詳解Liquibase如何自動化數據庫腳本部署

 

如果您在文件中使用的是UTF8編碼,那么請務必在liquibase.bat文件中添加一行:IF NOT DEFINED JAVA_OPTS set JAVA_OPTS=-Dfile.encoding=UTF–8。

一文詳解Liquibase如何自動化數據庫腳本部署

 

配置項目和Liquibase

下面,讓我們來組織各個文件(在本例中,我的GIT存儲庫放在文件夾HR中)。在各個文件夾中,我們可以在項目開發的過程中創建不同的文件。如果您有其他類型的對象(如“創建或替換”類型),那么只需要用它們創建“同義(synonyms)”文件夾即可。

一文詳解Liquibase如何自動化數據庫腳本部署

 

Liquibase中的文件組織

#path to our master changelog file changeLogFile:Liquibase/update.xml #dbhost and credentials url:  jdbc:oracle:thin:@127.0.0.1:1521/XEPDB1 username: HR password: XXXXXX #OJDBC driver localization classpath:Liquibase/ojdbc8.jar #schema, whereLiquibasewill store it’s DATABASECHANGELOG and DATABASECHANGELOGLOCK table(if other than HR, remember to add grants to HR!) liquibaseSchemaName: HR #default  SQL file name generated byLiquibase outputFile=output_local.sql #debug mode loglevel=SEVERE #extra option fromLiquibase, we don’t need it for now. liquibase.hub.mode=off 
一文詳解Liquibase如何自動化數據庫腳本部署

 

更新了的Liquibase文件夾結構

現在,我們創建一個update.xml文件,并將它放入帶有OJDBC文件的、新的 hr/Liquibase文件夾中:

<?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-4.3.xsd"></databaseChangeLog> 

使用 Oracle Wallet(可選)

如果您的Oracle數據庫托管在Oracle自治數據庫上,那么就需要使用Wallet,通過Liquibase去連接它。為此,請下載Wallet并記住其密碼。

請將您的WALLET_NAME.ZIP解壓到之前創建的HR/Liquibase文件夾中,并編輯
HR/liquibase/wallet_name/ojdbc.properties文件:

一文詳解Liquibase如何自動化數據庫腳本部署

 

更改ojdsb.properties

修改后的文件如上圖所示。在
javax.net.ssl.trustStorePassword和javax.net.ssl.keyStorePassword行,你可以設置ATP Wallet的密碼。


liquibase_local.properties文件中,請編輯URL一行,并設置連接的名稱(即,來自Wallet/tnsnames.ora,以及去往Wallet的路徑):

url: jdbc:oracle:thin:@rgatp28_high?TNS_ADMIN=liquibase/Wallet_RGATP28 

當然,請檢查您的sqlnet.ora文件,確保其“SSL_SERVER_DN_MATCH=yes”,且無需改變其他地方。

將Liquibase與數據庫連接

如果一切設置正確,我們便可以順利連接上DEV數據庫。讓我們從HR文件夾(Liquibase的屬性文件位置)處啟動CLI,并輸入:

Liquibase—defaultsFile=liquibase_dev.properties updateSQL 
一文詳解Liquibase如何自動化數據庫腳本部署

 

VSCode終端中的updateSQL命令

其中:

  • Liquibase會調用LB的環境路徑。
  • defaultsFile指定屬性文件的名稱和位置。如果您將屬性文件命名為“liquibase.properties”,那么可以省略此命令。
  • updateSQL負責生成SQL腳本(它并不會對數據庫執行任何操作)。

幾秒鐘后,LB將會生成output_file.sql:

一文詳解Liquibase如何自動化數據庫腳本部署

 

生成的output_file.sql

如前所述,如果您在數據庫中運行該腳本,它將創建兩個表:DATABASECHANGELOG和DATABASECHANGELOGLOCK。下面,讓我們通過Liquibase—defaultsFile=liquibase_dev.properties update,來創建這些表。其中的update命令是對數據庫執行SQL語句。完成后,您將看到如下結構:

一文詳解Liquibase如何自動化數據庫腳本部署

 

我們需要創建一個changelog文件,并指向包含對象的文件夾。在此,我創建了如下HR/master.xml文件:

<?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-4.3.xsd"> <includeAll path="triggers" relativeToChangelogFile="true"/> <includeAll path="views" relativeToChangelogFile="true"/> <includeAll path="types" relativeToChangelogFile="true"/> <includeAll path="package_spec" relativeToChangelogFile="true"/> <includeAll path="package_bodies" relativeToChangelogFile="true"/> </databaseChangeLog> 

它指向對象文件夾、及其所有內容。為了將主changelog文件HR/liquibaseupdate.xml設置為指向master.xml文件的路徑,您只需添一行:

<include file="./master.xml"/> 
一文詳解Liquibase如何自動化數據庫腳本部署

 

在update.xml中的include file="./master.xml"

由于Liquibase始終會從Liquibase_dev.properties文件和update.xml文件處運行,因此我們需要讓它能夠“看到”所有的文件。

跟蹤DML和DDL數據庫的更改

我們需要為DML和DDL類型的更改創建一個單獨的changelog文件,并將更改集寫入其中。為此,我們只需創建一個changelog.sql文件,并輸入如下內容,以將其標記為LiquibaseSQL文件:

—Liquibaseformatted sql 
一文詳解Liquibase如何自動化數據庫腳本部署

 

將changelog.sql標記為LiquibaseSQL文件

我們通過在master.xml文件中添加如下內容,以指向新的changelog:

一文詳解Liquibase如何自動化數據庫腳本部署

 

指向新的changelog

指向changelog或文件夾的順序是非常重要的。它需要告知Liquibase在運行SQL時的順序。我們最好先運行changelog(其中包含了“create table(...)”),然后再運行使用該表的編譯包。

下面,讓我們在變更集中創建第一個項目表:

—changeset AUTHOR:CHANGESET_NAME —comment OPTIONAL COMMENT YOUR DDL 
一文詳解Liquibase如何自動化數據庫腳本部署

 

創建第一個項目表

為了預覽到數據庫有哪些更改,我們讓LB生成對應的SQL文件。

Liquibase—defaultsFile=liquibase_dev.properties updateSQL 
一文詳解Liquibase如何自動化數據庫腳本部署

 

由Liquibase生成SQL文件

您可能注意到了,LB通過設置LOCKED = 1,來鎖定DATABASECHANGELOGLOCK表。也就是說,當您將腳本運行到DB時,列LOCKED被設置為1。而當另一個用戶同時運行LB時,Liquibase將為此等待,直到鎖定被放開,再創建一個SHOES表,將日志的更改插入到DATABASECHANGELOG中,并從DATABASECHANGELOGLOCK表中釋放掉已有的鎖。

如果一切正常,如下腳本會被執行到數據庫中:

Liquibase—defaultsFile=liquibase_dev.properties update 

接著,表SHOES會被創建出來。

一文詳解Liquibase如何自動化數據庫腳本部署

 

我們也可以查詢到誰、為何、以及何時創建了這張表。

一文詳解Liquibase如何自動化數據庫腳本部署

 

跟蹤包、視圖等其他更改

我們也可以如法創建其他腳本。在此,我通過2個單獨的文件,創建了一個SHOES_PKG包。每個文件都是帶有附加參數的唯一變更集,并被標記為Liquibase格式的SQL文件。

一文詳解Liquibase如何自動化數據庫腳本部署

 

SHOES_BODY和SHOES_SPEC SQL文件

其中:

  • runOnChange:true ——意味著每次更改包時,Liquibase都會針對數據庫運行該變更集,也就是編譯這個包。
  • stripComments:false ——意味著不要去除代碼注釋。

因此,LB在對數據庫進行updateSQL操作時,就會去編譯包的規范(package spec)、以及包的主體(package body)。一旦我們在數據庫中通過update命令編譯這些包,它們都會被記錄下來。

一文詳解Liquibase如何自動化數據庫腳本部署

 

通過查看MD5SUM的列值可知,它是變更集的最后一次校驗和。也就是說,運行了updateSQL后,所有前期被“掛起”的更改都被執行,而且除了鎖定LB表外,LB不會在SQL中生成任何內容。

一文詳解Liquibase如何自動化數據庫腳本部署

 

運用updateSQL檢查output_local.sql

現在,讓我們改變SHOES_PKG本身,并保存該文件。

一文詳解Liquibase如何自動化數據庫腳本部署

 

更新SHOES_PKG本身

那么該文件的校驗和會發生變化,LB將再次編譯這個包,并運行更新。

一文詳解Liquibase如何自動化數據庫腳本部署

 

Liquidbase中的更新

一文詳解Liquibase如何自動化數據庫腳本部署

 

數據庫中的更新

Liquibase將再次編譯這個包,并使用DATABASECHANGELOG表中的實際DATEEXECUTED和新的MD5SUM等變更集,去更新相應的行。

如何在現有軟件項目中安裝Liquibase?

雖然我們好幾種方法可以讓Liquibase為現有的數據庫實現自動化,但是我在此只向您展示最實用的兩種。您可以從中選擇最適合實際需求的一種。

當現有的項目中有很多對象時

我們通過在項目的存儲庫中配置Liquibase,并保留所有文件的基礎上,在master.xml文件中添加指向它們的路徑。具體而言,在實施Liquibase之前,我創建了2個過程和2個觸發器:

P_ADD_JOB_HISTORY P_SECURE_DML TRG_SECURE_EMPLOYEES TRG_UPDATE_JOB_HISTORY 
一文詳解Liquibase如何自動化數據庫腳本部署

 

現有的P_ADD_JOB_HISTORY.sql文件

您并不需要將“changeset”或“–Liquibaseformatted sql”添加到文件中。

一文詳解Liquibase如何自動化數據庫腳本部署

 

更新后master.xml中的文件路徑

我在自己的master.xml中添加了一個指向PROCEDURES文件夾的路徑。

下面,讓我們運行LiquibaseupdateSQL,并查看Liquibase會執行什么樣的SQL:

Liquibase—defaultsFile=liquibase_dev.properties updateSQL 
一文詳解Liquibase如何自動化數據庫腳本部署

 

首次嘗試更新SQL

既然我們的數據庫中已經有了這些過程和觸發器,我們就需要通過ChangelogSync和ChangelogSyncSQL命令,避免重復創建。讓我們運行ChangelogSyncSQL,并查看其結果。

Liquibase—defaultsFile=liquibase_dev.properties ChangelogSyncSQL 

輸出的SQL文件為:

一文詳解Liquibase如何自動化數據庫腳本部署

 

可見,SQL文件只插入了一個DATABASECHANGELOG表。它會告知Liquibase這些對象已經創建好了,不需要再次運行。現在,我們便可以將其插入到Oracle數據庫中了:

Liquibase—defaultsFile=liquibase_dev.properties ChangelogSync 

此時,在DATABASECHANGELOG表中會有4個新的變更集:

一文詳解Liquibase如何自動化數據庫腳本部署

 

您也許會問,這些奇怪的“raw”ID 是什么?為什么作者又被稱為“includeAll”呢?這是因為我們采取了最簡單、最快捷的方式,將現有的項目遷移到了Liquibase處,而這些變更集是被自動創建的。

當然,您也可以進行一些更改。例如,在P_ADD_JOB_HISTORY中,只需添加一個changeset,就像您在創建新數據庫對象時常做的那樣。

一文詳解Liquibase如何自動化數據庫腳本部署

 

更改P_ADD_JOB_HISTORY

然后運行Liquibase的更新命令:

一文詳解Liquibase如何自動化數據庫腳本部署

 

現在,Changeset就帶有了合適的作者、ID等信息。

在上面的示例中,我向您展示了添加現有對象(可創建或替換)的簡單方法,且無需手動創建變更集。我認為這是將Liquibase安裝到擁有數百個對象的、現有數據庫中的最佳方式。不過,當涉及到庫里有不能被替換的對象(如表格)時,我們需要使用另一種方式。

當現有項目中沒有很多對象時

創建或替換的對象

正如前面所描述過的,請添加對象,并在master.xml文件中記下文件夾的路徑。接著請運行ChangelogSync,并讓Liquibase自動創建raw/includeAll/filename的變更集。

一文詳解Liquibase如何自動化數據庫腳本部署

 

由Liquibase生成的變更集

當然,您也可以采用更好的方法,為每個文件創建一個變更集,如下圖所示:

一文詳解Liquibase如何自動化數據庫腳本部署

 

雖然這會需要更多的工作,但是您可以在日志中獲得更全面的信息:

一文詳解Liquibase如何自動化數據庫腳本部署

 

針對無法創建或替換的對象,您同樣有兩種方法:

  • 對這些對象不做任何操作,但請記住始終為其中的每個更改(包括:更改表、刪除列等)創建變更集,并將其添加到changelog.sql文件中。
  • 創建變更集并將它們標記為過去已被執行過。

在此,我們著重討論第二種方式。由于在實施Liquibase之前我已創建好了EMPLOYEES和JOBS兩張表,因此我會在新的文件夾HR/scripts_before_Liquibase中,創建changelog_ddl.sql和changelog_constraints.sql兩個changelog文件。此外,我也創建了另一個scripts_before_liquibase.xml文件,并將其指向這兩個changelog。其中的“include file”通過優先級的方式,告知Liquibase運行腳本的順序,即:首先創建表,然后創建約束和索引。

一文詳解Liquibase如何自動化數據庫腳本部署

 

新的scripts_before_liquibase.xml文件

這兩個文件能夠方便您在表中創建ref_constraint時,避免產生沖突。如下圖所示,請記住在master.xml文件中,將路徑添加到新創建的XML文件(即
HR/script_before_liquibase/scripts_before_liquibase.xml)中。

一文詳解Liquibase如何自動化數據庫腳本部署

 

下面是為各種表和約束創建的變更集。

一文詳解Liquibase如何自動化數據庫腳本部署

 

在添加了所有的變更集之后,我們將它們標記為已執行的狀態。

讓我們運行ChangelogSyncSQL來進行預覽,并讓ChangelogSync對數據庫執行SQL。

一文詳解Liquibase如何自動化數據庫腳本部署

 

運行ChangeSyncSQL和ChangelogSync

下圖展示了ChangelogSync命令執行后,更新了的數據庫。至此,我們已大功告成,您也可以選用自己喜歡的方式,通過Liquibase來實現數據庫的自動化。

一文詳解Liquibase如何自動化數據庫腳本部署

 

小結

如您所見,通過使用Liquibase,我們可以在數據庫更改的發布過程中,跟蹤所有的相關內容。其中,需要開發人員遵守如下流程:

  • 基于變更集的唯一性,并結合AUTHOR:ID(task)與文件名(帶changelog的文件),將變更集添加到changelog中。而且,請不要在沒有Liquibase的情況下,更改任何內容。
  • 驗證待執行的SQL。
  • 運行數據庫的update命令(記住,應當先運行updateSQL,再執行update命令)。
  • 通過檢查數據庫對象和DATABASECHANGELOG表,驗證變更集是否已被執行。

【51CTO原創稿件,合作站點轉載請注明原文作者和出處為51CTO.com】

分享到:
標簽:Liquibase
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定