背景
在我們?nèi)粘.a(chǎn)品發(fā)布的過(guò)程中,代碼的版本控制可以使用git、svn工具實(shí)現(xiàn)。對(duì)于數(shù)據(jù)庫(kù)每當(dāng)發(fā)布時(shí)會(huì)出現(xiàn)手動(dòng)執(zhí)行sql腳本進(jìn)行升級(jí)數(shù)據(jù)庫(kù),中間經(jīng)常出現(xiàn)一些漏寫(xiě)、錯(cuò)寫(xiě)情況,對(duì)數(shù)據(jù)庫(kù)的版本與代碼的版本不匹配,導(dǎo)致上線后出現(xiàn)數(shù)據(jù)庫(kù)不同步的問(wèn)題。flyway就是對(duì)數(shù)據(jù)庫(kù)版本進(jìn)行控制的工具,可以對(duì)不同環(huán)境的sql進(jìn)行遷移操作。
簡(jiǎn)介
flyway 的官網(wǎng):https://flywaydb.org/
flyway會(huì)對(duì)每次執(zhí)行過(guò)sql腳本保存到flyway_schema_history中,在數(shù)據(jù)庫(kù)中將保存sql腳本的版本號(hào)和對(duì)sql生成checksum,當(dāng)下次執(zhí)行數(shù)據(jù)庫(kù)遷移的時(shí)候就會(huì)按照版本號(hào)從低往高執(zhí)行。如果以前的版本號(hào)腳本已經(jīng)執(zhí)行過(guò)就不會(huì)執(zhí)行,如果以前版本的sql腳本已經(jīng)被修改在執(zhí)行的過(guò)程中則會(huì)報(bào)錯(cuò)。對(duì)flyway的詳細(xì)描述與介紹可以查看flyway的官網(wǎng)。
Flyway的工作流程
maven使用
//配置flywaydb的maven插件org.flywaydbflyway-maven-plugin5.2.4 //插件需要配置mysql-connector 注:mysql-connector的版本號(hào)與flyway的版本 號(hào)如果flyway 5.2以上對(duì)應(yīng)msyql 8.0mysqlmysql-connector-java8.0.27 //配置信息 //配置用戶(hù)連接地址 jdbc:mysql://192.168.1.1:3306/test?characterEncoding=utf-8rootroot //配置sql腳本的保存位置filesystem:sql/flyway/migrate //配置baseline版本信息2.0.0
配置好以上maven組件,在IDEA中就可以看到flyway的快捷插件了。
在插件中undo不能使用,undo為回滾操作。回滾操作只有使用商業(yè)版才能使用。
SQL數(shù)據(jù)位置
執(zhí)行
命令行執(zhí)行
mvn flyway:baseline //初始化數(shù)據(jù)庫(kù)鏈接mvn flyway:migrate //遷移數(shù)據(jù)
IDEA 工具執(zhí)行(點(diǎn)擊baseline、migrate)
SQL腳本命名規(guī)范
使用migrate必須開(kāi)頭是V+版本號(hào)+“_ _“+描述.sql
如V1.0.3_20220618__increment.sql
插件比較常用的功能介紹
Baseline
對(duì)已經(jīng)存在數(shù)據(jù)庫(kù)schema結(jié)構(gòu)的數(shù)據(jù)庫(kù)的一種解決方案。實(shí)現(xiàn)在非空數(shù)據(jù)庫(kù)新建metaData flyway_schema_history表,并把Migrations應(yīng)用到該數(shù)據(jù)庫(kù);也可以在已有表格的數(shù)據(jù)庫(kù)中添加metaData數(shù)據(jù)表。注:對(duì)已有的數(shù)據(jù)結(jié)構(gòu)的數(shù)據(jù)庫(kù)來(lái)說(shuō),必須要進(jìn)行baseline,才能進(jìn)行migrate
Clean
清楚掉對(duì)應(yīng)數(shù)據(jù)庫(kù)Schema中所有的對(duì)象,包括表結(jié)構(gòu),視圖,存儲(chǔ)過(guò)程等,clean操作再dev和test階段很好用,但是在生產(chǎn)環(huán)境務(wù)必禁用。
Migrate
執(zhí)行migrate會(huì)在指定文件夾下的sql按照版本號(hào)依次執(zhí)行遷移操作。也就是執(zhí)行sql腳本,對(duì)已經(jīng)執(zhí)行過(guò)的sql腳本便不再執(zhí)行。