flyway是一個數據庫版本管理工具,集成進springboot后,每次系統升級啟動時自動執行sql語句升級數據庫,避免手動操作數據庫。
1.maven引入依賴
<dependency> <groupId>org.flywaydb</groupId> <artifactId>flyway-core</artifactId> </dependency>
2.application.properties文件增加配置
## 開啟,默認開啟 flyway.enabled=true ## sql 腳本的位置,默認為 classpath:db/migration。可手動指定 flyway.locations=classpath:db/sqlVersion ## 指定數據源,如果沒有指定的話,將使用配置的主數據源 flyway.url=jdbc:mysql://10.0.192.10:3306/demo?useUnicode=true&useSSL=false&characterEncoding=utf8 flyway.user=repl flyway.password=root flyway.check-location=true # 如果數據庫不是空表,需要設置成 true,否則啟動報錯 flyway.baseline-on-migrate=true #默認初始版本號為1 flyway.baseline-version=0
3.指定flyway.locations目錄下創建sql腳本
命名規則:源碼默認初始版本號為V1,sql腳本版本號需大於1, sql腳本命名 :V版本號__名稱.sql,
注:版本號后面為兩條下划線,后續腳本版本號需大於當前最大版本號;
springboot啟動時,加載flyway組件,執行sql腳本。
首次使用flyway,springboot啟動時,會自動創建schema_version表,維護歷史sql版本變更信息。
sql腳本執行順序為:按版本號從小到大;
歷史sql腳本一旦隨springboot啟動升級,無論腳本執行成功還是失敗,后續開發不能再做修改,否則,springboot啟動時由於校驗到腳本文件有變更而導致報錯,無法啟動成功。
若同時升級多個版本,中間某個版本的腳本執行失敗,則執行失敗的腳本內操作會回滾,同時,后面的版本不會執行,而且springboot啟動失敗。
若腳本執行失敗,需要及時處理解決,以下兩種解決方式:
1:刪除失敗的版本記錄,修改腳本,重新打包部署;
2:更新失敗的版本信息字段 success為“1”即成功,新增正確的sql腳本,並賦值新的版本號,然后重新啟動springboot, 啟動時會忽略失敗的版本,繼續執行后面的版本;
schema_version表:
4.flyway 多數據源配置
若同一個項目中有多個數據源需要進行版本管理,則需要放棄application.properties中的配置,
並且配置flyway.enabled=false,禁止springboot自動的調用flyway.migrate()方法。然后增加配置類,手動調用migrate()方法即可。
1 package cn.demo.test.config; 2 3 import javax.annotation.PostConstruct; 4 import javax.annotation.Resource; 5 import javax.sql.DataSource; 6 7 import org.flywaydb.core.Flyway; 8 import org.springframework.beans.factory.annotation.Autowired; 9 import org.springframework.context.annotation.Configuration; 10 11 @Configuration 12 public class FlywayDbInitializer { 13 14 @Resource 15 private DataSource dataSource;//系統中已經注入的數據源 16 17 @Resource 18 private DataSource dmDataSource;//多個數據源 19 20 @PostConstruct 21 public void migrateFlyway() { 22 23 Flyway alertFlyway = new Flyway(); 24 alertFlyway.setBaselineOnMigrate(true); 25 alertFlyway.setDataSource(dataSource); 26 alertFlyway.setSchemas("alert"); 27 alertFlyway.setLocations("db/alertVersion"); 28 alertFlyway.setValidateOnMigrate(false);//是否校驗checksum值 29 alertFlyway.setIgnoreFailedFutureMigration(false); 30 // alertFlyway.setBaselineVersionAsString("1.1");//基准版本,<=1.1不會執行。 31 alertFlyway.migrate(); 32 Flyway dmFlyway = new Flyway(); 33 dmFlyway.setDataSource(dmDataSource); 34 dmFlyway.setBaselineOnMigrate(true); 35 dmFlyway.setSchemas("data_devops"); 36 dmFlyway.setLocations("db/dataDevopsVersion"); 37 dmFlyway.migrate(); 38 } 39 }