FlywayDB 是一款 開源數據庫版本管理工具,開發中將表結構的變更或數據初始化腳本維護好,更新到測試環境或線上發版啟動服務的時候,會檢測版本號自動執行數據庫變更,可以減少每次發版到其他環境的人工執行操作。
工作流程
-
初始化階段
首次運行時檢查目標數據庫是否存在flyway_schema_history
表,不存在則創建。 -
腳本掃描與版本比對
默認掃描classpath:db/migration
目錄下的腳本(可配置),按版本號排序后與歷史表比對。
版本號規則:V<版本號>__<描述>.sql
,版本號需唯一且遞增,否則報錯。
版本號建議使用時間戳或遞增數字,如V20230701__description.sql -
遷移執行
對比歷史表后,執行未應用的腳本,并記錄版本、校驗和等信息到元數據表。
使用 CRC32 算法校驗腳本內容,防止篡改。 -
鎖機制
通過數據庫排他鎖(如SELECT ... FOR UPDATE
)協調多節點并發執行,確保遷移原子性。
項目集成
1. 添加依賴
<dependency><groupId>org.flywaydb</groupId><artifactId>flyway-core</artifactId>
</dependency>
2. Nacos配置
spring:flyway:enabled: truelocations: classpath:db/updatevalidate-on-migrate: trueencoding: UTF-8# placeholders:# table-prefix: "test_"baseline-on-migrate: true # 對非空數據庫首次使用時設為true# baseline-version: "20250701" # 基線版本號table: table_update_history # 使用自定義表名out-of-order: false # 生產環境必須按順序執行
這里以項目下3個腳本為例,先插入一張新表,然后分別插入1月到3月、4月到6月的數據,數據庫中沒有這張表。
項目啟動完會看到庫里多了event_tracking表,插入了兩個腳本初始化的數據。
同時會按配置生成表變更記錄,維護腳本變更版本號。
這里有幾點要注意:
- 如果數據庫用戶沒有建表權限,則需要管理員提前創建;
- 表結構需符合Flyway要求;
- 如果使用多個數據源,需要為每個數據源配置單獨的Flyway實例,每個實例會維護自己的歷史表;
- 可以配置clean-on-validation-error: true便于調試,但生產環境必須禁用此選項;
- 如果項目組開發人員比較多,有些迭代版本開發周期比較長,之前開發定義好的版本號,在開發環境執行沒問題,等測完真正發版的時候,版本號可能不是最大的(中間有其他開發先發版),這時需要重新維護版本號;