---
# System prepended metadata

title: DB Migration tools
tags: [Spring 基礎]

---

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