SpringBoot整合Flyway實現(xiàn)數(shù)據(jù)庫的初始化和版本管理操作
一、Flyway
1、介紹
Flyway 是一款開源的
數(shù)據(jù)庫版本管理工具
。它可以很方便的在命令行中使用,或者在Java應用程序中引入,用于管理我們的數(shù)據(jù)庫版本。
官方文檔:https://flywaydb.org/documentation/
2、業(yè)務痛點
日常開發(fā)中常有以下場景:
- 一個系統(tǒng)有多套環(huán)境,更新表的SQL可能會遺漏某一個環(huán)境
- 每次部署一個新環(huán)境,就得把所有庫表的創(chuàng)建SQL手動執(zhí)行一遍。多希望服務啟動,就創(chuàng)建自己需要的庫表
- 每次發(fā)版要記錄數(shù)據(jù)庫變更信息,或者單獨給出數(shù)據(jù)庫升級腳本
- 別人需求新增了SQL你不知道,系統(tǒng)一跑出來個數(shù)據(jù)庫報錯又得問人或者排錯
3、個人理解
flyway,就像數(shù)據(jù)庫界的Git。
git做一個項目里代碼的版本管理,flyway做一個項目數(shù)據(jù)庫的版本管理。
- Version control for your database.
- Robust schema evolution across all your environments.
- With ease, pleasure and plain SQL.
使用了 Flyway 之后,如果再想進行數(shù)據(jù)庫版本升級,就不用改之前的數(shù)據(jù)庫腳本了,直接創(chuàng)建新的數(shù)據(jù)庫腳本,項目在啟動時檢測了有新的更高版本的腳本,就會自動執(zhí)行
二、SpringBoot整合flyway
1、整合 在pom文件中導入flyway依賴
<dependency> <groupId>org.flywaydb</groupId> <artifactId>flyway-core</artifactId> <version>5.2.4</version> </dependency>
- 注意和springboot之間的版本適配問題 - flyway版本不建議太高
配置文件application或者bootstrap中新加flyway的配置
# flyway 配置 spring: flyway: # 啟用或禁用 flyway enabled: true # flyway 的 clean 命令會刪除指定 schema 下的所有 table, 生產(chǎn)務必禁掉。這個默認值是 false 理論上作為默認配置是不科學的。 clean-disabled: true # SQL 腳本的目錄,多個路徑使用逗號分隔 默認值 classpath:db/migration locations: classpath:db/migration # metadata 版本控制信息表 默認 flyway_schema_history table: flyway_schema_history # 如果沒有 flyway_schema_history 這個 metadata 表, 在執(zhí)行 flyway migrate 命令之前, 必須先執(zhí)行 flyway baseline 命令 # 設置為 true 后 flyway 將在需要 baseline 的時候, 自動執(zhí)行一次 baseline。 baseline-on-migrate: true # 指定 baseline 的版本號,默認值為 1, 低于該版本號的 SQL 文件, migrate 時會被忽略 baseline-version: 1 # 字符編碼 默認 UTF-8 encoding: UTF-8 # 是否允許不按順序遷移 開發(fā)建議 true 生產(chǎn)建議 false out-of-order: false # 需要 flyway 管控的 schema list,這里我們配置為flyway 缺省的話, 使用spring.datasource.url 配置的那個 schema, # 可以指定多個schema, 但僅會在第一個schema下建立 metadata 表, 也僅在第一個schema應用migration sql 腳本. # 但flyway Clean 命令會依次在這些schema下都執(zhí)行一遍. 所以 確保生產(chǎn) spring.flyway.clean-disabled 為 true schemas: flyway # 執(zhí)行遷移時是否自動調(diào)用驗證 當你的 版本不符合邏輯 比如 你先執(zhí)行了 DML 而沒有 對應的DDL 會拋出異常 validate-on-migrate: true
注意clean-disabled!?。? - 表示是否要清除已有庫下的表 - 即執(zhí)行腳本V1__xxx.sql,會先清除已有庫下的表?。∪缓笤賵?zhí)行腳本 - 設置為true,即確定關(guān)掉clean功能
resource/db/migration下添加數(shù)據(jù)庫腳本(這個路徑是上面配置中寫的)
啟動服務,顯示控制臺可以看到SQL被執(zhí)行,并產(chǎn)生了歷史記錄表
2、SQL文件命名
注意SQL的命名規(guī)范有要求:
舉例:V2.0.1.7__create_core_table.sql
- V是前綴 表示這個文件只會被執(zhí)行一次
- 2.0.1.7為版本號 ,高版本的執(zhí)行后不會再執(zhí)行低版本的SQL。如2.0.1.7先執(zhí)行了,2.0.1.6就不會被執(zhí)行了
__
: 兩個下劃線表示分隔符- create_user_table :腳本功能表述
- .sql: 后綴
注意flyway比較版本的先后是采用左對齊原則, 缺位用 0 代替,比如
- 1.0.1.1 比 1.0.1 高 - 1.0.10.0 比 1.0.9.9 高 - 1.0.10 和 1.0.010 一樣高
需要執(zhí)行多次的,以大寫"R"開頭,命名如R__insertInfo.sql ,R的腳本只要改變了就會執(zhí)行,R不帶版本號
。
3、版本號校驗算法
flyway在升級數(shù)據(jù)庫時會先計算之前已經(jīng)升級過的腳本的checksum值和數(shù)據(jù)庫的checkSum值進行比對,如果老腳本發(fā)生了變化后checkSum校驗就會失敗,從而拋出異常,checkSum計算算法為CRC32 (循環(huán)冗余校驗碼)算法
新增的腳本則會和數(shù)據(jù)庫中的版本號進行比較,如果小于數(shù)據(jù)庫存儲的最后一個版本號,也不會繼續(xù)執(zhí)行。
4、工作流程
- 項目啟動,成功連接到數(shù)據(jù)庫,flyway開始運行。
- 第一次使用,flyway會創(chuàng)建flyway_schema_history表,用于記錄SQL的執(zhí)行記錄
- flyway掃描classpath:db/migration路徑下的所有SQL腳本,并與flyway_schema_history表的記錄對比
- 若表里沒記錄,即新SQL,執(zhí)行并將信息寫入history表 - R開頭的文件只要發(fā)生修改,都會執(zhí)行一遍 - V開頭的文件,如果上次執(zhí)行過后又發(fā)生了修改,則服務啟動報錯 - 想讓V開頭的已經(jīng)執(zhí)行過的文件再執(zhí)行一次,就得清楚history表中的數(shù)據(jù)后再啟動服務
5、注意事項
- 報錯后需要刪除flyway_schema_history中記錄,否則啟動失敗
- V文件的優(yōu)先級高于R,假如三個V遷移腳本和一個R(無論新建還是修改)一起執(zhí)行,其中一個V報錯,則V會全部執(zhí)行完成且記錄到flyway_schema_history中,而R不執(zhí)行且不記錄,刪除表中報錯記錄后,重新啟動,則執(zhí)行原錯誤V和未執(zhí)行的R
- 多個要執(zhí)行的R中,如果出現(xiàn)了其中一個出現(xiàn)了錯誤,則在其后的R都不執(zhí)行
- R的執(zhí)行順序根據(jù)命名來進行排序
- 一個文件中ddl并不由一個事務管理,比如創(chuàng)建三個表,中間創(chuàng)建表語句報錯,則第一個表還是會創(chuàng)建成功并且提交事務
- 同一個遷移文件下假設都是DML(即insert、delete、update),那么如果中間出現(xiàn)錯誤,所有的DML語句都會回滾
- 已經(jīng)執(zhí)行過的遷移文件(V)不能修改,否則啟動報錯
- 版本號相同會報錯(Found more than one migration with version 1.0.0.9)
- 刪除sql文件后啟動會報錯,報錯如下:
If you removed this migration intentionally, run repair to mark the migration as deleted.
到此這篇關(guān)于SpringBoot整合Flyway實現(xiàn)數(shù)據(jù)庫的初始化和版本管理的文章就介紹到這了,更多相關(guān)SpringBoot整合Flyway內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- IDEA創(chuàng)建SpringBoot項目整合mybatis時mysql-connector-java報錯異常的詳細分析
- SpringBoot整合Mysql和Redis的詳細過程
- springboot整合JPA訪問Mysql的實現(xiàn)方法
- SpringBoot整合Sharding-JDBC實現(xiàn)MySQL8讀寫分離
- Springboot整合camunda+mysql的集成流程分析
- springboot的yml配置文件通過db2的方式整合mysql的教程
- Springboot 使用maven release插件執(zhí)行版本管理及打包操作
- 如何在spring boot項目中使用Spring Security的BCryptPasswordEncoder類進行相同密碼不同密文的加密和驗證
相關(guān)文章
Spring Security OAuth2 實現(xiàn)登錄互踢的示例代碼
這篇文章主要介紹了Spring Security OAuth2實現(xiàn)登錄互踢的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-04-04Java中tomcat memecached session 共享同步問題的解決辦法
這篇文章主要介紹了Java中tomcat memecached session 共享同步問題的解決辦法的相關(guān)資料,需要的朋友可以參考下2015-10-10Spring定時任務關(guān)于@EnableScheduling的用法解析
這篇文章主要介紹了Spring定時任務關(guān)于@EnableScheduling的用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-06-06mybatis解決<foreach>標簽不能超過1000的問題
MyBatis是一個開源的持久層框架,它可以幫助開發(fā)者簡化數(shù)據(jù)庫操作的編寫,而foreach是MyBatis中的一個重要標簽,用于在SQL語句中進行循環(huán)操作,本文主要給大家介紹了mybatis解決<foreach>標簽不能超過1000的問題,需要的朋友可以參考下2024-05-05SpringBoot中通過實現(xiàn)WebMvcConfigurer參數(shù)校驗的方法示例
這篇文章主要介紹了SpringBoot中通過實現(xiàn)WebMvcConfigurer參數(shù)校驗的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-11-11