成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

譯文
數據庫 其他數據庫 自動化
本文通過實例的形式,向您介紹并展示了一種能夠實現自動化腳本部署的數據庫產品--Liquibase。

[[439170]]

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

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

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

配置項目和Liquibase

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

Liquibase中的文件組織

  1. #path to our master changelog file 
  2. changeLogFile:Liquibase/update.xml 
  3. #dbhost and credentials 
  4. url:  jdbc:oracle:thin:@127.0.0.1:1521/XEPDB1 
  5. username: HR 
  6. password: XXXXXX 
  7. #OJDBC driver localization 
  8. classpath:Liquibase/ojdbc8.jar 
  9. #schema, whereLiquibasewill store it’s DATABASECHANGELOG and DATABASECHANGELOGLOCK table(if other than HR, remember to add grants to HR!) 
  10. liquibaseSchemaName: HR 
  11. #default  SQL file name generated byLiquibase 
  12. outputFile=output_local.sql 
  13. #debug mode 
  14. loglevel=SEVERE 
  15. #extra option fromLiquibase, we don’t need it for now. 
  16. liquibase.hub.mode=off 

更新了的Liquibase文件夾結構

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

  1. <?xml version="1.0″ encoding="UTF-8″?><databaseChangeLog 
  2. xmlns="http://www.liquibase.org/xml/ns/dbchangelog" 
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  4. xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog 
  5. 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文件:

更改ojdsb.properties

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

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

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

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

將Liquibase與數據庫連接

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

  1. Liquibase—defaultsFile=liquibase_dev.properties updateSQL 

VSCode終端中的updateSQL命令

其中:

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

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

生成的output_file.sql

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

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

  1. <?xml version="1.0″ encoding="UTF-8″?> 
  2. <databaseChangeLog 
  3. xmlns="http://www.liquibase.org/xml/ns/dbchangelog" 
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  5. xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog 
  6. http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.3.xsd"> 
  7. <includeAll path="triggers" relativeToChangelogFile="true"/> 
  8. <includeAll path="views" relativeToChangelogFile="true"/> 
  9. <includeAll path="types" relativeToChangelogFile="true"/> 
  10. <includeAll path="package_spec" relativeToChangelogFile="true"/> 
  11. <includeAll path="package_bodies" relativeToChangelogFile="true"/> 
  12. </databaseChangeLog> 

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

  1. <include file="./master.xml"/> 

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

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

跟蹤DML和DDL數據庫的更改

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

  1. —Liquibaseformatted sql 

將changelog.sql標記為LiquibaseSQL文件

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

指向新的changelog

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

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

  1. —changeset AUTHOR:CHANGESET_NAME 
  2. —comment OPTIONAL COMMENT 
  3. YOUR DDL 

創建第一個項目表

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

  1. Liquibase—defaultsFile=liquibase_dev.properties updateSQL 

由Liquibase生成SQL文件

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

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

  1. Liquibase—defaultsFile=liquibase_dev.properties update 

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

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

跟蹤包、視圖等其他更改

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

SHOES_BODY和SHOES_SPEC SQL文件

其中:

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

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

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

運用updateSQL檢查output_local.sql

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

更新SHOES_PKG本身

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

Liquidbase中的更新

數據庫中的更新

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

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

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

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

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

  1. P_ADD_JOB_HISTORY 
  2. P_SECURE_DML 
  3. TRG_SECURE_EMPLOYEES 
  4. TRG_UPDATE_JOB_HISTORY 

現有的P_ADD_JOB_HISTORY.sql文件

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

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

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

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

  1. Liquibase—defaultsFile=liquibase_dev.properties updateSQL 

首次嘗試更新SQL

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

  1. Liquibase—defaultsFile=liquibase_dev.properties ChangelogSyncSQL 

輸出的SQL文件為:

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

  1. Liquibase—defaultsFile=liquibase_dev.properties ChangelogSync 

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

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

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

更改P_ADD_JOB_HISTORY

然后運行Liquibase的更新命令:

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

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

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

創建或替換的對象

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

由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運行腳本的順序,即:首先創建表,然后創建約束和索引。

新的scripts_before_liquibase.xml文件

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

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

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

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

運行ChangeSyncSQL和ChangelogSync

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

小結

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

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

原文標題:What is Liquibase? How to Automate Your Database Script Deployment,作者:Rafal Grzegorczyk

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

 

責任編輯:華軒 來源: 51CTO
相關推薦

2020-12-11 10:20:33

Ansible運維軟件包

2022-02-15 08:07:17

測試軟件開發

2024-02-29 14:27:37

人工智能機器學習物聯網

2021-03-16 12:08:32

Python 服務器腳本

2015-05-28 10:46:22

shellBackupdatabase

2019-08-27 20:00:23

2023-02-13 23:39:48

數據庫Mongodb存儲

2016-12-20 16:47:25

Hadoop部署腳本

2020-04-30 15:00:17

運維Ansible自動化

2014-03-11 11:10:10

PowerShell自動化腳本

2023-12-26 07:40:34

2022-07-28 09:02:41

文件存儲系統

2023-07-17 10:45:03

向量數據庫NumPy

2013-02-27 15:48:05

自動化備份FacebookPB級別數據庫

2020-07-16 07:30:15

數據庫SQL技術

2017-01-17 15:14:49

MySQL數據庫自動化

2011-05-12 13:15:36

數據庫日常維護

2018-01-31 18:10:15

數據庫HBase

2011-04-01 15:07:29

數據庫自動化

2024-01-11 07:32:00

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美乱人伦视频 | 欧美1区2区 | 日韩在线观看精品 | 91精品国产91 | 亚洲一本 | 国产在线播 | aaaaaa大片免费看最大的 | 成人在线网 | 99精品久久| 黄色一级片视频 | 色综合久 | 午夜视频免费在线观看 | 中文字幕在线看人 | 欧美精品一区二区三区在线 | 91麻豆精品国产91久久久更新资源速度超快 | 成人免费视频网站在线观看 | 毛片入口| 亚洲精品中文字幕在线 | 欧美成人精品一区二区男人看 | 日本五月婷婷 | 国产精品久久久久久 | 日韩综合在线播放 | 在线国产视频 | 成人在线中文字幕 | 91精品国产91久久久久久最新 | 91在线一区 | 国产精品久久久久久婷婷天堂 | 亚洲视频精品 | 国产一区在线免费 | 全免费a级毛片免费看视频免 | 天天爽综合网 | 中文字幕福利 | 欧美日本韩国一区二区 | 日本成人区| 暖暖成人免费视频 | 少妇av片| 亚洲一区视频 | 两性午夜视频 | 欧美h| 综合色播| 中国黄色毛片视频 |