偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

一文詳解Liquibase如何自動化數(shù)據(jù)庫腳本部署

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

[[439170]]

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

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

Liquibase的基本特點

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

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

什么是Liquibase?

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

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

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

從安裝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中)。在各個文件夾中,我們可以在項目開發(fā)的過程中創(chuàng)建不同的文件。如果您有其他類型的對象(如“創(chuàng)建或替換”類型),那么只需要用它們創(chuàng)建“同義(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文件夾結構

現(xiàn)在,我們創(chuàng)建一個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數(shù)據(jù)庫托管在Oracle自治數(shù)據(jù)庫上,那么就需要使用Wallet,通過Liquibase去連接它。為此,請下載Wallet并記住其密碼。

請將您的WALLET_NAME.ZIP解壓到之前創(chuàng)建的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與數(shù)據(jù)庫連接

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

  1. Liquibase—defaultsFile=liquibase_dev.properties updateSQL 

VSCode終端中的updateSQL命令

其中:

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

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

生成的output_file.sql

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

我們需要創(chuàng)建一個changelog文件,并指向包含對象的文件夾。在此,我創(chuàng)建了如下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數(shù)據(jù)庫的更改

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

  1. —Liquibaseformatted sql 

將changelog.sql標記為LiquibaseSQL文件

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

指向新的changelog

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

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

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

創(chuàng)建第一個項目表

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

  1. Liquibase—defaultsFile=liquibase_dev.properties updateSQL 

由Liquibase生成SQL文件

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

如果一切正常,如下腳本會被執(zhí)行到數(shù)據(jù)庫中:

  1. Liquibase—defaultsFile=liquibase_dev.properties update 

接著,表SHOES會被創(chuàng)建出來。

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

跟蹤包、視圖等其他更改

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

SHOES_BODY和SHOES_SPEC SQL文件

其中:

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

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

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

運用updateSQL檢查output_local.sql

現(xiàn)在,讓我們改變SHOES_PKG本身,并保存該文件。

更新SHOES_PKG本身

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

Liquidbase中的更新

數(shù)據(jù)庫中的更新

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

如何在現(xiàn)有軟件項目中安裝Liquibase?

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

當現(xiàn)有的項目中有很多對象時

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

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

現(xiàn)有的P_ADD_JOB_HISTORY.sql文件

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

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

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

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

  1. Liquibase—defaultsFile=liquibase_dev.properties updateSQL 

首次嘗試更新SQL

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

  1. Liquibase—defaultsFile=liquibase_dev.properties ChangelogSyncSQL 

輸出的SQL文件為:

可見,SQL文件只插入了一個DATABASECHANGELOG表。它會告知Liquibase這些對象已經創(chuàng)建好了,不需要再次運行?,F(xiàn)在,我們便可以將其插入到Oracle數(shù)據(jù)庫中了:

  1. Liquibase—defaultsFile=liquibase_dev.properties ChangelogSync 

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

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

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

更改P_ADD_JOB_HISTORY

然后運行Liquibase的更新命令:

現(xiàn)在,Changeset就帶有了合適的作者、ID等信息。

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

當現(xiàn)有項目中沒有很多對象時

創(chuàng)建或替換的對象

正如前面所描述過的,請?zhí)砑訉ο?,并在master.xml文件中記下文件夾的路徑。接著請運行ChangelogSync,并讓Liquibase自動創(chuàng)建raw/includeAll/filename的變更集。

由Liquibase生成的變更集

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

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

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

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

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

新的scripts_before_liquibase.xml文件

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

下面是為各種表和約束創(chuàng)建的變更集。

在添加了所有的變更集之后,我們將它們標記為已執(zhí)行的狀態(tài)。

讓我們運行ChangelogSyncSQL來進行預覽,并讓ChangelogSync對數(shù)據(jù)庫執(zhí)行SQL。

運行ChangeSyncSQL和ChangelogSync

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

小結

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

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

原文標題: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

測試軟件開發(fā)

2015-05-28 10:46:22

shellBackupdatabase

2024-02-29 14:27:37

人工智能機器學習物聯(lián)網

2019-08-27 20:00:23

2021-03-16 12:08:32

Python 服務器腳本

2023-02-13 23:39:48

數(shù)據(jù)庫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

文件存儲系統(tǒng)

2023-07-17 10:45:03

向量數(shù)據(jù)庫NumPy

2013-02-27 15:48:05

自動化備份FacebookPB級別數(shù)據(jù)庫

2020-07-16 07:30:15

數(shù)據(jù)庫SQL技術

2017-01-17 15:14:49

MySQL數(shù)據(jù)庫自動化

2011-05-12 13:15:36

數(shù)據(jù)庫日常維護

2025-04-03 08:30:00

Python數(shù)據(jù)庫ORM

2023-11-29 16:16:14

Redis數(shù)據(jù)庫

2024-01-11 07:32:00

點贊
收藏

51CTO技術棧公眾號