--- tags: Spring 基礎 --- # DB Migration tools ## Flyway v.s. Liquibase 以Java來說這兩個最多人用、Spring 官方文件只提到這兩個。 相同: * 都有開源版本(免費) * Spring Boot 官方對於兩者都有提供內建支援。 * 都有提供 Java-based migration [Flyway Java-based migration](https://flywaydb.org/documentation/concepts/migrations#java-based-migrations)、[Liquibase customChange](https://docs.liquibase.com/change-types/custom-change.html) * 都是基於 version 的 db migration * 都支援很多資料庫種類,但 Flyway 少一點 相異: | | Flyway | Liquibase | | -------- | -------- | -------- | | 付費版價格 | Teams: $504 user/year, 包含 RedGate support | Pro: Starting at $5000 per year| | DB Type | 不支援 NoSQL | 支援關聯式資料庫與 NoSQL | | 資料庫定義 change | 可以使用 SQL, Java,不同資料庫環境要寫不同的 SQL 檔(ex. 測試在h2,產品在MySQL)。 | 可以使用 sql, xml, json, yaml, groovy, java,最後由 Liquibase 解析,所以可以在不同資料庫環境使用同個檔案。 | | 選擇性部署 | 如上,受影響的環境都要再寫一次。 | 如上,add labels and contexts to ensure that this is set up in one place | | 管理 order of changes | 順序是檔名中的版本號 (ex. V0__creat_account_table.sql, V1__add_name.sql),檔名是自己取且是線性的,所以在多人開發情況下可能會有衝突很難管理。 | 會透過單獨的檔``master_changelog``來管理,所以變更順序很容易 | | 回滾 | 需要付費 | 一般回滾免費,回滾特定更改要花錢 | | 快照 | 目前還在beta階段,付費可以使用 | 有 | | 比對兩個資料庫的資料(diff) | 沒有這項功能,官方建議用專門的工具 | 有 | | Dry run | 要付費 | 免費 | | Dashboard | 開發中? Flightpath | 免費,使用 Liquibase Hub | | 預定條件決定能否進行migration | 無法 | 可以,利用 preconditions | | 預先定義資料驗證的規則 | 無法 | 可以 | ## 流程: ### Flyway [設定 Gradle](https://flywaydb.org/documentation/getstarted/firststeps/gradle) [設定 SQL Server](https://flywaydb.org/documentation/database/sqlserver) 1. 設定: 在 build.gradle 加 plugins, dependency, flyway 放 yml 的 datasource 那些資訊。 2. 資料庫定義要變動: 在 resources 新增 db/migration 資料夾,再新增 .sql 創資料表(注意檔名要按照規定) 3. Migration:gradle 執行 flywayMigrate ### Liquibase [設定 Gradle](https://docs.liquibase.com/tools-integrations/gradle/getting-started-liquibase-gradle.html) [設定 SQL Server](https://docs.liquibase.com/install/tutorials/mssql.html) 1. 設定:與 Flyway 相似 2. 資料庫定義要變動: 新增changelog.sql(或是json, xml, yaml, groovy),在裡面加入changeset,最後在build.gradle 加入 task section。(看官方教學很清楚) 3. Migration:gradle 執行 update 總體比較下來, Flyway 比較適合小專案,因為流程相對簡單。 Liquibase 比較適合大專案,因為不限於 SQL,其他語言也能用,不一定需要會SQL才能用,且能使用的功能也比較多, changes 的管理是獨立出來的也比較不會發生多人開發導致的版本衝突。 參考 [Spring boot 官方文件](https://docs.spring.io/spring-boot/docs/2.7.4/reference/html/howto.html#howto.data-initialization.migration-tool) [Liquibase 官網寫的liquibase-vs-flyway](https://www.liquibase.com/liquibase-vs-flyway) https://twgreatdaily.com/OYXjeHkBAxbFhpvDi0WL.html https://www.baeldung.com/liquibase-vs-flyway https://www.796t.com/content/1541782626.html [Flyway tutorial](https://www.youtube.com/watch?v=dJDBP7pPA-o) [Liquibase tutorial](https://www.youtube.com/watch?v=lf6Mxb9rVng)