首頁 > 軟體

比較Flyway與Liquibase兩大資料庫遷移工具

2021-05-17 13:00:48

眾所周知,對於那些使用著關係型資料庫引擎的各類應用程式而言,資料庫遷移工具的選用是至關重要的。它們不但能夠讓各種複雜且重複的過程更加自動化,而且可以讓我們更加輕鬆且準確地完成各種大型的遷移任務。

下面,我將對兩種最常見的開源遷移工具--Flyway和Liquibase,進行介紹與比較,以方便您在實際項目中做出合理的選擇。

Flyway的介紹

Flyway是由Redgate公司帶來的一款開源式的資料庫遷移工具。該工具注重規則上的簡約性,而非繁瑣的配置。

目前,它能夠支援諸如Postgres、Oracle、SQL Server、DB2、H2、以及MariaDB等大多數主流資料庫引擎。同時,Flyway還可以支援諸如:Amazon RDS、Google Cloud SQL、以及Heroku等基於雲端業務的資料庫服務。

該工具所用到的指令碼既可以用純SQL(支援多種SQL語法),又能夠用Java(主要用於更復雜的轉換)來進行編寫。同時,它既帶有命令列客戶端,又提供支援Maven和Gradle的插件。此外,它的Java API,還適用於Android系統。

Flyway的Evolve非常適用於習慣了使用.NET和C#的使用者。因此,如果您對其有興趣的話,請檢視文末列出的它在GitHub上的連結頁面。

Liquibase的介紹

作為於2006年推出的、可用於資料庫遷移的開源類工具,Liquibase是基於變更日誌(changelog)和變更集(changesets)檔案的相關概念實現的。這些檔案可以由SQL、XML、YAML、以及JSON編寫而成。它們通過儲存那些針對資料庫結構的更改,以便將其應用到任何其他資料庫的例項上。

目前,Liquibase支援的資料庫種類包括:Postgres、Oracle、DB2、H2、MariaDB、SQL Server、以及SQLite等。同時,它還支援諸如:Azure SQL、Amazon RDS、以及Amazon Aurora等許多基於雲的資料庫。

您可以使用諸如Maven、Gradle、甚至是Ant之類的構建工具,從Shell中運行Liquibase的遷移指令碼。此外,您可以一次生成純粹的SQL查詢,以便您的DBA、Ops、DevOps團隊、或負責資料庫的任何人,可以進一步執行此類查詢。

有了對於上述兩種工具的基本概念,下面讓我們來討論一下它們之間的相同點和不同之處。

Flyway和Liquibase之間的相似之處

在某種程度上,兩者都屬於開源的,並且能夠免費提供各種功能。當然它們也都具有提供更多高階功能的付費版本。兩者都可以使用簡單、傳統的SQL,來編寫出遷移指令碼。兩者都能完美地「面向Java」,並且都內建了針對Maven和Gradle之類基本構建工具的支援,以及可以與諸如:Spring Boot等最常見的Java框架相整合。兩者都可以從命令列處運行簡單的shell指令碼。雖然兩者支援的資料庫版本和驅動程式,可能存在著一些細微的差異,但是從整體而言,它們能夠支援的資料庫品種大致相似。在處理資料庫更改時,兩者用到了相同的方法,即:基於遷移的資料庫交付。兩種工具都實現了由Martin Fowler提出和詮釋的資料庫重構(Evolutionary database) 的概念(詳見本末連結)。

Flyway和Liquibase之間的不同之處

下面,讓我們從橫跨多個數據庫引擎來運行相同指令碼的角度,來討論Flyway和Liquibase的不同之處。

首先,我們會碰到的一個實際問題是:如何針對例項生產差異(diff)。您會發現,我們可以直接使用Liquibase來生成相關差異;卻無法使用Flyway來實現,而且即便是其付費版本也無法達到。這便是我們往往在項目中選擇Liquibase,而非Flyway的主要原因之一。

其次,我們來看看Java客戶端。Flyway擁有原生的Java API,它可以幫助我們進行諸如BLOB和CLOB的更改、以及高階批量資料的修改等較為複雜的遷移。這些功能在某些受限制的遷移場景中,是非常實用的。因此這反過來成為了使用者選用Flyway,而非Liquibase的主要原因之一。

接著,我們來討論兩種工具是如何處理回滾的。我們設定Liquibase的changelog檔案相對比較容易。實際上,changelog的XML結構甚至已經為回滾程式碼定義好了一個特殊的欄位。而Flyway僅在其付費版本中提供了回滾處理的服務。因此,如果您不介意使用付費工具的話,可以考慮使用Flyway的相關功能。當然,據說Liquibase的付費版本,對於不同類型的回滾,具有更完備的支援。您如果有時間和精力的話,可以去試用一下。

最後,讓我們來看看更改順序的管理。對此,兩種工具有著完全不同的處理方法。Flyway採取的是線性資料庫版本控制的概念。這意味著,應用更改的順序,取決於遷移指令碼的名稱順序。實際上,Flyway的遷移指令碼有著一個完整的命名規則。如果您希望它能夠按照預期執行的話,就必須遵循該規則。而在Liquibase中,資料庫例項的更改順序,基於整個changelog檔案中的特定更改位置。也就是說,如果您將更改按照某種特定的順序放在changelog中的話,那麼對於資料庫的更改也將以完全相同的順序執行並完成。

小結

綜上所述,我們對Flyway和Liquibase兩種資料庫遷移工具進行了綜合比較。總的說來,Flyway的優點在於,其遷移指令碼更具有可讀性。如果您非常熟悉SQL的話,那麼它用起來更加便捷、更加順手。當然,它的缺點是無法實現跨平臺的使用。而Liquibase正好相反,其優點在於可以跨平臺被使用,其不足之處在於,由於它功能強大,因此我們可能需要花費一定的精力,去維護它的遷移指令碼。


IT145.com E-mail:sddin#qq.com