為什么使用Flyway
最簡單的一個項目是一個軟件連接到一個數(shù)據庫,但是大多數(shù)項目中我們不僅要處理我們開發(fā)環(huán)境的副本,還需要處理其他很多副本。例如:開發(fā)環(huán)境、測試環(huán)境、生產環(huán)境。想到數(shù)據庫管理,我們立刻就能想到一系列問題
- 如何快速收集執(zhí)行腳本的清單
- 執(zhí)行的腳本總要人工執(zhí)行,是否可以通過機器執(zhí)行
- 執(zhí)行的腳本是否已經在數(shù)據庫執(zhí)行過
- 執(zhí)行的腳本是否全部在數(shù)據庫中執(zhí)行過
- 執(zhí)行的腳本如何回退
- 如何初始化一個空數(shù)據庫實例
Flyway是一款數(shù)據庫版本控制管理工具,它可以簡單的、可靠的升級你的數(shù)據庫。它能幫助解決上面的問題。Flyway核心是記錄所有版本演化和狀態(tài)的MetaData,首次啟動創(chuàng)建默認名為SCHEMA_VERSION
的元素表。表中保存了版本,描述,要執(zhí)行的sql腳本等信息。
Flyway已經支持數(shù)據庫包括:Oracle, SQL Server, SQL Azure, DB2, DB2 z/OS, MySQL (
including Amazon RDS
), MariaDB, Google Cloud SQL, PostgreSQL (including Amazon RDS and Heroku
), Redshift, Vertica, H2, Hsql, Derby, SQLite, SAP HANA, solidDB, Sybase ASE and Phoeni
官網鏈接:https://flywaydb.org/
基于 Spring Boot + MyBatis Plus + Vue & Element 實現(xiàn)的后臺管理系統(tǒng) + 用戶小程序,支持 RBAC 動態(tài)權限、多租戶、數(shù)據權限、工作流、三方登錄、支付、短信、商城等功能
- 項目地址:https://github.com/YunaiV/ruoyi-vue-pro
- 視頻教程:https://doc.iocoder.cn/video/
SpringBoot集成Flyway
2.1 簡單示例
參考版本信息
參考目錄結構
1.創(chuàng)建SpringBoot應用,并添加flyway-core
依賴,本例中將實現(xiàn)初始化腳本到mysql數(shù)據庫,因此同時引入了驅動依賴 mysql-connector-java
<dependency>
<groupId>org.flywaydbgroupId>
<artifactId>flyway-coreartifactId>
<version>7.15.0version>
dependency>
參考pom.xml依賴如下
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starterartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-jdbcartifactId>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>8.0.28version>
dependency>
<dependency>
<groupId>org.flywaydbgroupId>
<artifactId>flyway-coreartifactId>
<version>7.15.0version>
dependency>
<dependency>
<groupId>org.junit.jupitergroupId>
<artifactId>junit-jupiter-apiartifactId>
<version>5.8.2version>
<scope>testscope>
dependency>
dependencies>
2.在application.properties
中設置flyway信息
server.port=7002
##是否啟動,默認開啟
spring.flyway.enabled = true
##腳本存放路徑
spring.flyway.locations = classpath:db/migration
##當flyway第一次運行時,會在我們對應的數(shù)據庫中新建一個記錄腳本運行情況的
spring.flyway.table=flyway_schema_history
> 基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現(xiàn)的后臺管理系統(tǒng) + 用戶小程序,支持 RBAC 動態(tài)權限、多租戶、數(shù)據權限、工作流、三方登錄、支付、短信、商城等功能
>
> * 項目地址:
> * 視頻教程:
# flyway指向的數(shù)據庫鏈接
spring.datasource.url=jdbc//127.0.0.1:3306/runoob?useUnicode=true&characterEncoding=utf8
# 用戶名
spring.flyway.user=nacos
# 密碼
spring.flyway.password=nacos
# 數(shù)據庫驅動
spring.flyway.driver-class-name=com.mysql.cj.jdbc.Driver
3.腳本整理
將腳本整理到resource/db.migration
路徑下,例如
參考SQL腳本信息如下
//V1.20190621.1854__CREATE_PERSION_TABLE.sql腳本內容
createtablePERSON(
IDintnotnull,
NAMEvarchar(100)notnull
);
//V1.20190621.1904__INIT_PERSION.sql腳本內容
insertintoPERSON(ID,NAME)values(1,'Axel');
insertintoPERSON(ID,NAME)values(2,'Mr.Foo');
insertintoPERSON(ID,NAME)values(3,'Ms.Bar');
sql 目錄中存放腳本文件,腳本名稱命名方式
- 版本化遷移 :執(zhí)行一遍,版本號唯一,有重復會報錯:格式:V+版本號 +雙下劃線+描述+結束符
- 重復的遷移 ,不需要版本號,腳本發(fā)生變化啟動就會執(zhí)行:格式:R+雙下劃線+描述+結束符
- 撤消遷移 :格式:U+版本號 +雙下劃線+描述+結束符
4.運行啟動主類,運行日志如下,從日志中可以看到如下信息
- 啟動后正確鏈接到數(shù)據庫runoob
- 驗證2個遷移腳本成功
-
使用命令行的方式創(chuàng)建了一張名稱為
flyway_schema_history
的記錄表,這里要注意,所有腳本一旦執(zhí)行了就會在flyway_schema_history
中創(chuàng)建記錄, 如果出錯引發(fā)問題,可以刪除表中記錄,反正啟動的時候還會再執(zhí)行,當然生產環(huán)境不建議此方法,但生產環(huán)境上部署的包都是驗證過無問題的包也不會出現(xiàn)此問題 -
執(zhí)行了
resource/db.migration
目錄下的兩個腳本,并執(zhí)行成功
INFO190688---[main]o.f.c.internal.license.VersionPrinter:FlywayCommunityEdition7.15.0byRedgate
INFO190688---[main]o.f.c.i.database.base.BaseDatabaseType:Database:jdbc//127.0.0.1:3306/runoob(MySQL5.7)
INFO190688---[main]o.f.core.internal.command.DbValidate:Successfullyvalidated2migrations(executiontime00:00.016s)
INFO190688---[main]o.f.c.i.s.JdbcTableSchemaHistory:CreatingSchemaHistorytable`runoob`.`flyway_schema_history`withbaseline...
INFO190688---[main]o.f.core.internal.command.DbBaseline:Successfullybaselinedschemawithversion:1
INFO190688---[main]o.f.core.internal.command.DbMigrate:Currentversionofschema`runoob`:1
INFO190688---[main]o.f.core.internal.command.DbMigrate:Migratingschema`runoob`toversion"1.20190621.1854-CREATEPERSIONTABLE"
INFO190688---[main]o.f.core.internal.command.DbMigrate:Migratingschema`runoob`toversion"1.20190621.1904-INITPERSION"
INFO190688---[main]o.f.core.internal.command.DbMigrate:Successfullyapplied2migrationstoschema`runoob`,nowatversionv1.20190621.1904(executiontime00:00.225s)
停止服務后,重新運行日志如下,從日志中可以看到信息
- 啟動后正確鏈接到數(shù)據庫runoob
- 驗證2個遷移腳本成功
-
本次沒有重復執(zhí)行腳本, 日志中打印當前腳本編號
20190621.1904
, 即最后1次執(zhí)行的腳本
INFO193184---[main]o.f.c.internal.license.VersionPrinter:FlywayCommunityEdition7.15.0byRedgate
INFO193184---[main]o.f.c.i.database.base.BaseDatabaseType:Database:jdbc//127.0.0.1:3306/runoob(MySQL5.7)
INFO193184---[main]o.f.core.internal.command.DbValidate:Successfullyvalidated3migrations(executiontime00:00.024s)
INFO193184---[main]o.f.core.internal.command.DbMigrate:Currentversionofschema`runoob`:1.20190621.1904
INFO193184---[main]o.f.core.internal.command.DbMigrate:Schema`runoob`isuptodate.Nomigrationnecessary.
查看Mysql數(shù)據庫
2.2 常見問題
1.Caused by: org.flywaydb.core.api.FlywayException: Found non-empty schema(s)
Causedby:org.flywaydb.core.api.FlywayException:Foundnon-emptyschema(s)`runoob`butnoschemahistorytable.Usebaseline()orsetbaselineOnMigratetotruetoinitializetheschemahistorytable.
atorg.flywaydb.core.Flyway$1.execute(Flyway.java:200)~[flyway-core-7.15.0.jar:na]
atorg.flywaydb.core.Flyway$1.execute(Flyway.java:170)~[flyway-core-7.15.0.jar:na]
atorg.flywaydb.core.Flyway.execute(Flyway.java:586)~[flyway-core-7.15.0.jar:na]
問題原因:第一執(zhí)行的時候沒有找到schema history table
,這張表其實就是application.properties
文件中spring.flyway.table
屬性配置的表,因此要么使用命令創(chuàng)建一個或者在application.properties
文件中設置 spring.flyway.baseline-on-migrate=true
,
2.Caused by: org.flywaydb.core.api.FlywayException: Unsupported Database: MySQL 5.7
Causedby:org.flywaydb.core.api.FlywayException:UnsupportedDatabase:MySQL5.7
atorg.flywaydb.core.internal.database.DatabaseTypeRegister.getDatabaseTypeForConnection(DatabaseTypeRegister.java:106)~[flyway-core-8.4.2.jar:na]
atorg.flywaydb.core.internal.jdbc.JdbcConnectionFactory.(JdbcConnectionFactory.java:75)~[flyway-core-8.4.2.jar:na]
atorg.flywaydb.core.FlywayExecutor.execute(FlywayExecutor.java:143)~[flyway-core-8.4.2.jar:na]
atorg.flywaydb.core.Flyway.migrate(Flyway.java:124)~[flyway-core-8.4.2.jar:na]
問題原因:flyway-core
對數(shù)據庫版本有要求,例如flyway-core
的當前最高版本V8.4.3,不能使用 MySQL 5.7, 當flyway-core
降低到V7.15.0后 問題解決,所以匹配flyway-core
和數(shù)據庫版本后問題即可解決
2.3 源碼參考
https://github.com/PNZBEIJINGL/springboot
總結
本文介紹了Springboot集成flyway方式
- 使用Flyway之前部署腳本方式一般為開發(fā)人員按照順序匯總數(shù)據庫的升級腳, 然后DBA或者售后在生產庫中按照順序執(zhí)行升級腳本。
- 使用Flyway之后部署腳本方式就變更為開發(fā)人員將腳本構建到程序包中, 部署程序包后啟動時Flyway自動執(zhí)行腳本升級
審核編輯 :李倩
-
自動化
+關注
關注
29文章
5575瀏覽量
79272 -
數(shù)據庫
+關注
關注
7文章
3799瀏覽量
64388 -
spring
+關注
關注
0文章
340瀏覽量
14343 -
SpringBoot
+關注
關注
0文章
173瀏覽量
178
原文標題:SpringBoot + Flyway,自動化實現(xiàn)數(shù)據庫版本控制
文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論