一. 什么是Flyway
Flyway 是一款開源的數據庫遷移工具。它采用簡單直觀的方式管理數據庫變更,通過版本化的遷移腳本確保數據庫結構的一致性和可重復性。無論是開發環境、測試環境還是生產環境,Flyway 都能確保數據庫變更按照預期順序執行,避免手動修改數據庫帶來的風險。
二. Flyway 原理簡介
- 識別當前版本:通過
flyway_schema_history
表檢查數據庫當前版本。 - 比對遷移腳本:將文件系統或類路徑中的遷移腳本與已執行的歷史記錄進行比對。
- 執行未應用的腳本:按照版本號順序執行所有未應用的遷移腳本。
- 記錄執行結果:將執行成功的腳本信息記錄到
flyway_schema_history
表中。
三.Flyway應用場景
- 團隊協作開發:確保團隊成員使用一致的數據庫結構。
- CI/CD 流水線:自動化數據庫變更,實現環境一致性。
- 多環境部署:開發、測試、生產環境使用相同的變更腳本。
- 數據庫重構:安全地執行大規模數據庫重構。
- 開源項目維護:方便貢獻者同步數據庫結構。
四.Spring boot 集成Flyway
1. 添加依賴
<dependency><groupId>org.flywaydb</groupId><artifactId>flyway-mysql</artifactId><version>9.16.3</version>
</dependency>
2.flyway配置:
flyway:# 是否自動執行基準遷移,# 當?baseline-on-migrate?設為?false(這是默認值)時,Flyway 遇到未管理的數據庫就會報錯,不會自動進行基線操作。# 當?baseline-on-migrate?設為?true?時,如果 Flyway 發現數據庫里沒有?flyway_schema_history?表(也就是該數據庫還沒被 Flyway 管理過),它會先執行基線操作,再進行遷移。#基線操作會創建?flyway_schema_history?表,并且記錄所有版本低于?baseline-version(默認是 1)的遷移腳本,將它們標記為已執行。baseline-on-migrate: true# baseline的版本號,默認為1.0baseline-version: 1.0# 是否開啟flyway,默認true.enabled: true# 設置遷移時的編碼,默認UTF-8.encoding: UTF-8# 當讀取元數據表時是否忽略錯誤的遷移,默認false.ignore-failed-future-migration: false# 遷移腳本的位置,默認db/migration.locations: classpath:/flyway# 遷移時是否校驗,默認為truevalidate-on-migrate: true# flyway 的 clean 命令會刪除指定 schema 下的所有 table, 生產務必禁掉。這個默認值是 false 理論上作為默認配置是不科學的。clean-disabled: true# 驗證錯誤時 是否自動清除數據庫 高危操作!clean-on-validation-error: false#配置 Flyway 以允許非順序遷移out-of-order: true
補充數據庫相關的配置:
spring:datasource:dynamic:# 設置默認的數據源或者數據源組,默認值即為 masterprimary: masterdatasource:# 主庫數據源master:type: your_connect_pooldriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/your_databaseusername: your_usernamepassword: your_password
3.取消集成Flyway
當flyway的依賴和配置是在公共配置里,如果某一個微服務不使用數據庫,不需要集成Flyway,即可在該微服務的啟動類中添加exclude
import org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration;@SpringBootApplication(exclude = FlywayAutoConfiguration.class)
4.添加SQL腳本
根據配置locations指定的位置創建sql腳本文件,如:V1__Create_User_Table.sql
注意,遷移腳本的名字必須遵循以下規則:必須是以V字母開頭,然后放版本號(小數點有多少個不限制),然后是2個下劃線(必須兩個下劃線),最后接上版本描述,必須以sql作為后綴名。
當微服務執行時,flyway會根據flyway_schema_history中記錄的腳本執行情況,執行對應的SQL腳本。?