SpringBoot 04 集成Flyway实现数据库版本控制.docx
- 文档编号:4562513
- 上传时间:2022-12-06
- 格式:DOCX
- 页数:13
- 大小:17.66KB
SpringBoot 04 集成Flyway实现数据库版本控制.docx
《SpringBoot 04 集成Flyway实现数据库版本控制.docx》由会员分享,可在线阅读,更多相关《SpringBoot 04 集成Flyway实现数据库版本控制.docx(13页珍藏版)》请在冰豆网上搜索。
SpringBoot04集成Flyway实现数据库版本控制
SpringBoot04集成Flyway实现数据库版本控制
1.为什么用法Flyway
最容易的一个项目是一个软件衔接到一个数据库,但是大多数项目中我们不仅要处理我们开发环境的副本,还需要处理其他无数副本。
例如:
开发环境、测试环境、生产环境。
想到数据库管理,我们立即就能想到一系列问题
如何迅速收集执行脚本的清单
执行的脚本总要人工执行,是否可以通过机器执行
执行的脚本是否已经在数据库执行过
执行的脚本是否所有在数据库中执行过
执行的脚本如何回退
如何初始化一个空数据库实例
Flyway是一款数据库版本控制管理工具,它可以容易的、牢靠的升级你的数据库。
它能协助解决上面的问题。
Flyway核心是记录全部版本演变和状态的MetaData,首次启动创建默认名为SCHEMA_VERSION的元素表。
表中保存了版本,描述,要执行的sql脚本等信息。
Flyway已经支持数据库包括:
Oracle,SQLServer,SQLAzure,DB2,DB2z/OS,MySQL(includingAmazonRDS),MariaDB,GoogleCloudSQL,PostgreSQL(includingAmazonRDSandHeroku),Redshift,Vertica,H2,Hsql,Derby,SQLite,SAPHANA,solidDB,SybaseASEandPhoeni
官网链接:
Homepage-Flyway
Flyway是如何工作的?
可以查看之前的一篇译文,这里就不再重复了,本文主要介绍Springboot如何集成flyway
【译文】数据库管理工具Flyway_学然后知不足!
-CSDN博客
2.SpringBoot集成Flyway
2.1容易示例
参考版本信息
示例信息版本
springboot2.6.2
flyway7.15.0
mysql5.7.30
参考名目结构
1.创建SpringBoot应用,并添加flyway-core依靠,本例中将实现初始化脚本到mysql数据库,因此同时引入了驱动依靠mysql-connector-java
org.flywaydb
flyway-core
7.15.0
参考pom.xml依靠如下
org.springframework.boot
spring-boot-starter
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-starter-jdbc
mysql
mysql-connector-java
8.0.28
org.flywaydb
flyway-core
7.15.0
org.junit.jupiter
junit-jupiter-api
5.8.2
test
2.在application.properties中设置flyway信息
server.port=7002
是否启动,默认开启
spring.flyway.enabled=true
脚本存放路径
spring.flyway.locations=classpath:
db/migration
当flyway第一次运行时,会在我们对应的数据库中新建一个记录脚本运行状况的
spring.flyway.table=flyway_schema_history
flyway指向的数据库链接
spring.datasource.url=jdbc:
mysql:
//127.0.0.1:
3306/runoob?
useUnicode=true&characterEncoding=utf8
用户名
spring.flyway.user=nacos
密码
spring.flyway.password=nacos
数据库驱动
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,&39;Axel&39;);
insertintoPERSON(ID,NAME)values(2,&39;Mr.Foo&39;);
insertintoPERSON(ID,NAME)values(3,&39;Ms.Bar&39;);
sql名目中存放脚本文件,脚本名称命名方式
版本化迁移:
执行一遍,版本号唯一,有重复会报错:
格式:
V+版本号+双下划线+描述+结束符
重复的迁移,不需要版本号,脚本发生变幻启动就会执行:
格式:
R+双下划线+描述+结束符
撤消迁移:
格式:
U+版本号+双下划线+描述+结束符
4.运行启动主类,运行日志如下,从日志中可以看到如下信息
启动后正确链接到数据库runoob
验证2个迁移脚本胜利
用法指令行的方式创建了一张名称为flyway_schema_history的记录表,这里要注重,全部脚本一旦执行了就会在flyway_schema_history中创建记录,假如出错引发问题,可以删除表中记录,反正启动的时候还会再执行,固然生产环境不建议此办法,但生产环境上部署的包都是验证过无问题的包也不会浮现此问题
执行了resource/db.migration名目下的两个脚本,并执行胜利
INFO190688---[main]o.f.c.internal.license.VersionPrinter:
FlywayCommunityEdition7.15.0byRedgate
INFO190688---[main]o.f.c.i.database.base.BaseDatabaseType:
Database:
jdbc:
mysql:
//127.0.0.1:
3306/runoob(MySQL5.7)
INFO190688---[main]mand.DbValidate:
Successfullyvalidated2migrations(executiontime00:
00.016s)
INFO190688---[main]o.f.c.i.s.JdbcTableSchemaHistory:
CreatingSchemaHistorytable——runoob——。
——flyway_schema_history——withbaseline
INFO190688---[main]mand.DbBaseline:
Successfullybaselinedschemawithversion:
1
INFO190688---[main]mand.DbMigrate:
Currentversionofschema——runoob——:
1
INFO190688---[main]mand.DbMigrate:
Migratingschema——runoob——toversion"1.20190621.1854-CREATEPERSIONTABLE"
INFO190688---[main]mand.DbMigrate:
Migratingschema——runoob——toversion"1.20190621.1904-INITPERSION"
INFO190688---[main]mand.DbMigrate:
Successfullyapplied2migrationstoschema——runoob——,nowatversionv1.20190621.1904(executiontime00:
00.225s)
停止服务后,重新运行日志如下,从日志中可以看到信息
启动后正确链接到数据库runoob
验证2个迁移脚本胜利
本次没有重复执行脚本,日志中打印当前脚本编号20190621.1904,即最后1次执行的脚本
INFO193184---[main]o.f.c.internal.license.VersionPrinter:
FlywayCommunityEdition7.15.0byRedgate
INFO193184---[main]o.f.c.i.database.base.BaseDatabaseType:
Database:
jdbc:
mysql:
//127.0.0.1:
3306/runoob(MySQL5.7)
INFO193184---[main]mand.DbValidate:
Successfullyvalidated3migrations(executiontime00:
00.024s)
INFO193184---[main]mand.DbMigrate:
Currentversionofschema——runoob——:
1.20190621.1904
INFO193184---[main]mand.DbMigrate:
Schema——runoob——isuptodate.Nomigrationnecessary.
查看Mysql数据库
2.2常见问题
1.Causedby:
org.flywaydb.core.api.FlywayException:
Foundnon-emptyschema(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]
问题缘由:
第一执行的时候没有找到schemahistorytable,这张表其实就是application.properties文件中spring.flyway.table属性配置的表,因此要么用法指令创建一个或者在application.properties文件中设置spring.flyway.baseline-on-migrate=true,
2.Causedby:
org.flywaydb.core.api.FlywayException:
UnsupportedDatabase:
MySQL5.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对数据库版本有要求,例如flyway-core的当前最高版本V8.4.3,不能用法MySQL5.7,当flyway-core降低到V7.15.0后问题解决,所以匹配flyway-core和数据库版本后问题即可解决
2.3源码参考
链接:
源码参考Demo-flyway
文章总结
本文介绍了Springboot集成flyway方式
用法Flyway之前部署脚本方式普通为开发人员根据挨次汇总数据库的升级脚,然后DBA或者售后在生产库中根据挨次执行升级脚本。
用法Flyway之后部署脚本方式就变更为开发人员将脚本构建到程序包中,部署程序包后启动时Flyway自动执行脚本升级
前一篇:
SpringBoot03大事监听处理
文章学问点与官方学问档案匹配,可进一步学习相关学问
Java技能树用法JDBC操作数据库JDBC概述6686人正在系统学习中
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SpringBoot 04 集成Flyway实现数据库版本控制 集成 Flyway 实现 数据库 版本 控制