flyway配置mysql_Flyway快速上手教程
一、Flyway是什么
官網解釋地非常全面,可先大致閱讀一下。
簡單地說,flyway是一個能對數據庫變更做版本控制的工具。
二、為什么要用Flyway
在多人開發的項目中,我們都習慣了使用SVN或者Git來對代碼做版本控制,主要的目的就是為了解決多人開發代碼沖突和版本回退的問題。
其實,數據庫的變更也需要版本控制,在日常開發中,我們經常會遇到下面的問題:
自己寫的SQL忘了在所有環境執行;
別人寫的SQL我們不能確定是否都在所有環境執行過了;
有人修改了已經執行過的SQL,期望再次執行;
需要新增環境做數據遷移;
每次發版需要手動控制先發DB版本,再發布應用版本;
其它場景...
有了flyway,這些問題都能得到很好的解決。
三、如何使用Flyway
3.1 準備數據庫
首先,我們需要準備好一個空的數據庫。(數據庫的安裝和賬密配置此處忽略)
此處以mysql為例,在本地電腦上新建一個空的數據庫,名稱叫做flyway,我們通過dbeaver看到的樣子如下:
新建一個空的數據庫
3.2 準備SpringBoot工程
在start.spring.io上新建一個SpringBoot工程,要求能連上自己本地新建的mysql數據庫flyway,這個步驟也比較簡單,就不再細講。
但要注意的是,application.properties中數據庫的配置務必配置正確,下述步驟中系統啟動時,flyway需要憑借這些配置連接到數據庫。這里貼一份:
# db config
spring.datasource.url=jdbc:mysql://localhost:3306/flyway?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
3.3flyway的引入與嘗試
首先,在pom文件中引入flyway的核心依賴包:
org.flywaydb
flyway-core
5.2.4
其次,在src/main/resources目錄下面新建db.migration文件夾,默認情況下,該目錄下的.sql文件就算是需要被flyway做版本控制的數據庫SQL語句。
但是此處的SQL語句命名需要遵從一定的規范,否則運行的時候flyway會報錯。命名規則主要有兩種:
僅需要被執行一次的SQL命名以大寫的"V"開頭,后面跟上"0~9"數字的組合,數字之間可以用“.”或者下劃線"_"分割開,然后再以兩個下劃線分割,其后跟文件名稱,最后以.sql結尾。比如,V2.1.5__create_user_ddl.sql、V4.1_2__add_user_dml.sql。
可重復運行的SQL,則以大寫的“R”開頭,后面再以兩個下劃線分割,其后跟文件名稱,最后以.sql結尾。。比如,R__truncate_user_dml.sql。
其中,V開頭的SQL執行優先級要比R開頭的SQL優先級高。
如下,我們準備了三個腳本,分別為:
V1__create_user.sql,其中代碼如下,目的是建立一張user表,且只執行一次。
CREATE TABLE IF NOT EXISTS `USER`(
`USER_ID` INT(11) NOT NULL AUTO_INCREMENT,
`USER_NAME` VARCHAR(100) NOT NULL COMMENT '用戶姓名',
`AGE` INT(3) NOT NULL COMMENT '年齡',
`CREATED_TIME` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`CREATED_BY` varchar(100) NOT NULL DEFAULT 'UNKNOWN',
`UPDATED_TIME` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`UPDATED_BY` varchar(100) NOT NULL DEFAULT 'UNKNOWN',
PRIMARY KEY (`USER_ID`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
V2__add_user.sql,其中代碼如下,目的是往user表中插入一條數據,且只執行一次。
insert into `user`(user_name,age) values('lisi',33);
R__add_unknown_user.sql,其中代碼如下,目的是每次啟動倘若有變化,則往user表中插入一條數據。
insert into `user`(user_name,age) values('unknown',33);
與之相對應的目錄截圖如下:
項目目錄結構
其中2.1.6、2.1.7和every的文件夾不會影響flyway對SQL的識別和運行,可以自行取名和分類。
到這一步,flyway的默認配置已經足夠我們開始運行了。此時,我們啟動SpringBoot的主程序,如果以上步驟沒有配置錯誤的話,運行截圖如下:
flyway成功運行
此時,我們刷新數據庫,可以看到flyway的歷史記錄表已經生成并插入了三個版本的記錄:
flyway_schema_history
而且,user表也已經創建好了并插入了兩條數據:
user
我們不改變任何東西,再次執行主程序,日志如下:
再次執行flyway
兩張數據庫表中的內容也毫無任何變化。
可是,如果我們修改V2__add_user.sql中的內容,再次執行的話,就會報錯,提示信息如下:
[ERROR] Migration checksum mismatch for migration version 2
如果我們修改了R__add_unknown_user.sql,再次執行的話,該腳本就會再次得到執行,并且flyway的歷史記錄表中也會增加本次執行的記錄。
3.4 maven插件的使用
以上步驟中,每次想要migration都需要運行整個springboot項目,并且只能執行migrate一種命令,其實flyway還是有很多其它命令的。maven插件給了我們不需要啟動項目就能執行flyway各種命令的機會。
在pom中引入flyway的插件,同時配置好對應的數據庫連接。
org.flywaydb
flyway-maven-plugin
5.2.4
jdbc:mysql://localhost:3306/flyway?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT
root
root
com.mysql.cj.jdbc.Driver
然后更新maven插件列表,就可以看到flyway的全部命令了。
flyway的各種命令
此時,我們雙擊執行上圖中的flyway:migrate的效果和啟動整個工程執行migrate的效果是一樣的。
其它命令的作用如下列出,各位可自行實驗體會:
baseline
對已經存在數據庫Schema結構的數據庫一種解決方案。實現在非空數據庫新建MetaData表,并把Migrations應用到該數據庫;也可以在已有表結構的數據庫中實現添加Metadata表。
clean
清除掉對應數據庫Schema中所有的對象,包括表結構,視圖,存儲過程等,clean操作在dev 和 test階段很好用,但在生產環境務必禁用。
info
用于打印所有的Migrations的詳細和狀態信息,也是通過MetaData和Migrations完成的,可以快速定位當前的數據庫版本。
repair
repair操作能夠修復metaData表,該操作在metadata出現錯誤時很有用。
undo
撤銷操作,社區版不支持。
validate
驗證已經apply的Migrations是否有變更,默認開啟的,原理是對比MetaData表與本地Migrations的checkNum值,如果值相同則驗證通過,否則失敗。
3.5 flyway補充知識
flyway執行migrate必須在空白的數據庫上進行,否則報錯;
對于已經有數據的數據庫,必須先baseline,然后才能migrate;
clean操作是刪除數據庫的所有內容,包括baseline之前的內容;
盡量不要修改已經執行過的SQL,即便是R開頭的可反復執行的SQL,它們會不利于數據遷移;
四、總結
在進行了如上的實驗后,相信我們都已經掌握了flyway的初步使用,當需要做數據遷移的時候,更換一個新的空白數據庫,執行下migrate命令,所有的數據庫更改都可以一步到位地遷移過去,真的是太方便了。
附錄
flyway的配置清單:
flyway.baseline-description對執行遷移時基準版本的描述.
flyway.baseline-on-migrate當遷移時發現目標schema非空,而且帶有沒有元數據的表時,是否自動執行基準遷移,默認false.
flyway.baseline-version開始執行基準遷移時對現有的schema的版本打標簽,默認值為1.
flyway.check-location檢查遷移腳本的位置是否存在,默認false.
flyway.clean-on-validation-error當發現校驗錯誤時是否自動調用clean,默認false.
flyway.enabled是否開啟flywary,默認true.
flyway.encoding設置遷移時的編碼,默認UTF-8.
flyway.ignore-failed-future-migration當讀取元數據表時是否忽略錯誤的遷移,默認false.
flyway.init-sqls當初始化好連接時要執行的SQL.
flyway.locations遷移腳本的位置,默認db/migration.
flyway.out-of-order是否允許無序的遷移,默認false.
flyway.password目標數據庫的密碼.
flyway.placeholder-prefix設置每個placeholder的前綴,默認${.
flyway.placeholder-replacementplaceholders是否要被替換,默認true.
flyway.placeholder-suffix設置每個placeholder的后綴,默認}.
flyway.placeholders.[placeholder name]設置placeholder的value
flyway.schemas設定需要flywary遷移的schema,大小寫敏感,默認為連接默認的schema.
flyway.sql-migration-prefix遷移文件的前綴,默認為V.
flyway.sql-migration-separator遷移腳本的文件名分隔符,默認__
flyway.sql-migration-suffix遷移腳本的后綴,默認為.sql
flyway.tableflyway使用的元數據表名,默認為schema_version
flyway.target遷移時使用的目標版本,默認為latest version
flyway.url遷移時使用的JDBC URL,如果沒有指定的話,將使用配置的主數據源
flyway.user遷移數據庫的用戶名
flyway.validate-on-migrate遷移時是否校驗,默認為true
總結
以上是生活随笔為你收集整理的flyway配置mysql_Flyway快速上手教程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux 线程优先级算法,能讲一下在L
- 下一篇: mysql generator备注_My