---
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)