springboot集成flyway

  • Flayway是一款數據庫版本控制管理工具,,支持數據庫版本自動升級,Migrations可以寫成sql腳本,也可以寫在java代碼裏;不僅支持CommandLine和java api ,也支持Build構建工具和Springboot,也可以在分佈式環境下能夠安全可靠安全地升級數據庫,同時也支持失敗恢復。

  • Flyway最核心的就是用於記錄所有版本演化和狀態的MetaData表,Flyway首次啓動會創建默認名爲SCHEMA_VERSION的元素局表。
    表中保存了版本,描述,要執行的sql腳本等;

  • sql腳本的格式:V+版本號 +雙下劃線+秒速+結束符

    例如:V1__INIT_DATABASE.sql

    上面的V 是默認值, 可以通過

    flyway.sql-migration-prefix來指定前綴

 

Migrate:

Migrate是指把數據Schema遷移到最新版本,在Migrate時會檢查MetaData元數據表,如果不存在就創建MetaData表,MetaData用於記錄數據庫歷史變更等信息;

Migrate會掃描指定文件系統或者classpath下的Migrations。會與MetaData中的記錄進行對比,進行版本升級;

 

Clean:清除掉對應數據庫Schema中所有的對象,包括表結構,視圖,存儲過程等,clean操作在dev 和 test階段很好用;

 

Info:用於打印所有的Migrations的詳細和狀態信息,也是通過MetaData和Migrations完成的,可以快速定位當前的數據庫版本;

 

validate:驗證以及apply的Migrations是否有變更,默認開啓的;原理是對比MetaData表與本地Migrations的checkNum值,如果值相同則驗證通過,否則失敗。

 

BaseLine:對已經存在數據庫Schema結構的數據庫一種解決方案。實現在非空數據庫新建MetaData表,並把Migrations應用到該數據庫;也可以應用到已有表結構的數據庫中也可以實現添加Metadata表。

repair:repair操作能夠修復metaData表,該操作在metadata出現錯誤時很有用

用途:

  1):移除失敗的Migration記錄,只針對不支持DDL事務的數據庫

  

使用Flayway:

1、引入flyway的依賴:

  1. <dependency>
  2. <groupId>org.flywaydb</groupId>
  3. <artifactId>flyway-core</artifactId>
  4. <version>5.0.3</version>
  5. </dependency>
  1. <plugin>
  2. <groupId>org.flywaydb</groupId>
  3. <artifactId>flyway-maven-plugin</artifactId>
  4. <version>5.0.3</version>
  5. </plugin>

2、新建一個maven的Springboot項目,在配置文件中配置數據源信息:

  1. server.port=8081
  2. spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb
  3. spring.datasource.username=root
  4. spring.datasource.password=
  5. spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

3、在classpath下新建/db/migration文件夾,並創建V1.1__init.sql腳本文件:

  1. use testdb;
  2. CREATE TABLE person (
  3. id int(11) NOT NULL AUTO_INCREMENT,
  4. first varchar(100) NOT NULL,
  5. last varchar(100) NOT NULL,
  6. dateofbirth DATE DEFAULT null,
  7. placeofbirth varchar(100) not null,
  8. PRIMARY KEY (id)
  9. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  10. insert into person (first,last,dateofbirth,placeofbirth) values('Dursun','KOC', STR_TO_DATE('02/10/1982', '%m/%d/%Y'),'Erzincan');
  11. insert into person (first,last,dateofbirth,placeofbirth) values('Durseeun','KeeOC', STR_TO_DATE('05/10/1982', '%m/%d/%Y'),'Erzeeincan');

4、啓動springboot項目:

加載了sql腳本 。

5、查看數據庫:

生成了flyway-schema-history表,這個版本默認是這個表,如果想自己指定schema表的命,可以設置:

flyway.tableflyway

6:flyway的一些其他配置:

  1. flyway.baseline-description對執行遷移時基準版本的描述.
  2. flyway.baseline-on-migrate當遷移時發現目標schema非空,而且帶有沒有元數據的表時,是否自動執行基準遷移,默認false.
  3. flyway.baseline-version開始執行基準遷移時對現有的schema的版本打標籤,默認值爲1.
  4. flyway.check-location檢查遷移腳本的位置是否存在,默認false.
  5. flyway.clean-on-validation-error當發現校驗錯誤時是否自動調用clean,默認false.
  6. flyway.enabled是否開啓flywary,默認true.
  7. flyway.encoding設置遷移時的編碼,默認UTF-8.
  8. flyway.ignore-failed-future-migration當讀取元數據表時是否忽略錯誤的遷移,默認false.
  9. flyway.init-sqls當初始化好連接時要執行的SQL.
  10. flyway.locations遷移腳本的位置,默認db/migration.
  11. flyway.out-of-order是否允許無序的遷移,默認false.
  12. flyway.password目標數據庫的密碼.
  13. flyway.placeholder-prefix設置每個placeholder的前綴,默認${.
  14. flyway.placeholder-replacementplaceholders是否要被替換,默認true.
  15. flyway.placeholder-suffix設置每個placeholder的後綴,默認}.
  16. flyway.placeholders.[placeholder name]設置placeholder的value
  17. flyway.schemas設定需要flywary遷移的schema,大小寫敏感,默認爲連接默認的schema.
  18. flyway.sql-migration-prefix遷移文件的前綴,默認爲V.
  19. flyway.sql-migration-separator遷移腳本的文件名分隔符,默認__
  20. flyway.sql-migration-suffix遷移腳本的後綴,默認爲.sql
  21. flyway.tableflyway使用的元數據表名,默認爲schema_version
  22. flyway.target遷移時使用的目標版本,默認爲latest version
  23. flyway.url遷移時使用的JDBC URL,如果沒有指定的話,將使用配置的主數據源
  24. flyway.user遷移數據庫的用戶名
  25. flyway.validate-on-migrate遷移時是否校驗,默認爲true.

7、重點說一下對已經存在表結構數據的已有數據庫使用flyway需要注意的幾個地方。

   
a、直接使用的話,啓動時會報如下錯誤:

        Caused by: org.flywaydb.core.api.FlywayException: Found non-empty schema(s) test without schema history     table! Use baseline() or set baselineOnMigrate to true to initialize the schema history table.

   
b、解決方案:設置setBaselineOnMigrate爲true。

   
c、但此時如果有腳本需要啓動加載執行的話,腳本的版本號一定要比1大才能執行(注意紅色標註),
舉個例子V1.0__Base_version.sql不會被執行,但V1.1__Base_version.sql就會被執行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章