0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

SpringBoot + Flyway,自动化实现数据库版本控制

jf_ro2CN3Fa 来源:CSDN 作者:CSDN 2022-12-02 14:26 次阅读


为什么使用Flyway

最简单的一个项目是一个软件连接到一个数据库,但是大多数项目中我们不仅要处理我们开发环境的副本,还需要处理其他很多副本。例如:开发环境、测试环境、生产环境。想到数据库管理,我们立刻就能想到一系列问题

  • 如何快速收集执行脚本的清单
  • 执行的脚本总要人工执行,是否可以通过机器执行
  • 执行的脚本是否已经在数据库执行过
  • 执行的脚本是否全部在数据库中执行过
  • 执行的脚本如何回退
  • 如何初始化一个空数据库实例

Flyway是一款数据库版本控制管理工具,它可以简单的、可靠的升级你的数据库。它能帮助解决上面的问题。Flyway核心是记录所有版本演化和状态的MetaData,首次启动创建默认名为SCHEMA_VERSION的元素表。表中保存了版本,描述,要执行的sql脚本等信息

Flyway已经支持数据库包括: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 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 视频教程:https://doc.iocoder.cn/video/

SpringBoot集成Flyway

2.1 简单示例

参考版本信息

7bf71424-7207-11ed-8abf-dac502259ad0.png

参考目录结构

7c111e8c-7207-11ed-8abf-dac502259ad0.png

1.创建SpringBoot应用,并添加flyway-core依赖,本例中将实现初始化脚本到mysql数据库,因此同时引入了驱动依赖 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第一次运行时,会在我们对应的数据库中新建一个记录脚本运行情况的
spring.flyway.table=flyway_schema_history

> 基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
>
> * 项目地址:
> * 视频教程

# flyway指向的数据库链接
spring.datasource.url=jdbc//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路径下,例如

7c2b9b5e-7207-11ed-8abf-dac502259ad0.png

参考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 目录中存放脚本文件,脚本名称命名方式

  • 版本化迁移 :执行一遍,版本号唯一,有重复会报错:格式:V+版本号 +双下划线+描述+结束符
  • 重复的迁移 ,不需要版本号,脚本发生变化启动就会执行:格式:R+双下划线+描述+结束符
  • 撤消迁移 :格式:U+版本号 +双下划线+描述+结束符
7c43493e-7207-11ed-8abf-dac502259ad0.png

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//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)

停止服务后,重新运行日志如下,从日志中可以看到信息

  • 启动后正确链接到数据库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//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数据库

7c677750-7207-11ed-8abf-dac502259ad0.png

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]

问题原因:第一执行的时候没有找到schema history table ,这张表其实就是application.properties文件中spring.flyway.table属性配置的表,因此要么使用命令创建一个或者在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对数据库版本有要求,例如flyway-core的当前最高版本V8.4.3,不能使用 MySQL 5.7, 当flyway-core 降低到V7.15.0后 问题解决,所以匹配flyway-core和数据库版本后问题即可解决

2.3 源码参考

https://github.com/PNZBEIJINGL/springboot

总结

本文介绍了Springboot集成flyway方式

  • 使用Flyway之前部署脚本方式一般为开发人员按照顺序汇总数据库的升级脚, 然后DBA或者售后在生产库中按照顺序执行升级脚本。
  • 使用Flyway之后部署脚本方式就变更为开发人员将脚本构建到程序包中, 部署程序包后启动时Flyway自动执行脚本升级


审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 自动化
    +关注

    关注

    28

    文章

    5052

    浏览量

    77805
  • 数据库
    +关注

    关注

    7

    文章

    3596

    浏览量

    63436
  • spring
    +关注

    关注

    0

    文章

    333

    浏览量

    14170
  • SpringBoot
    +关注

    关注

    0

    文章

    172

    浏览量

    110

原文标题:SpringBoot + Flyway,自动化实现数据库版本控制

文章出处:【微信号:芋道源码,微信公众号:芋道源码】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    深圳恒兴隆|自动换刀电主轴:实现加工自动化与高效的关键.

    深圳恒兴隆|自动换刀电主轴:实现加工自动化与高效的关键随着工业制造技术的不断进步,机床作为制造业的核心设备,其性能与效率的提升一直是行业关注的焦点。其中,电主轴作为数控机床的重要组成
    发表于 05-08 10:24

    通过Modbus读写数据库中的数据

    本文是将数据库数据转为Modbus服务端/从站,实现数据库内的数据也可以走Modbus协议通过网口或串口读写的案例,下图是通过智能网关的参
    发表于 03-14 13:44

    TC397怎么自动化烧录?

    TC397第一次烧录的时候需要先烧录六个包,使用Infineon Memtool 4.8软件,如果想要量产,怎么实现不用手动选择文件的烧录方式,使用自动化烧录
    发表于 01-25 07:03

    怎么简单实现由Labview读取的串口数据自增写入mysql5.7数据库中?

    怎么简单实现由Labview读取的串口数据自增写入mysql5.7数据库中? 已实现:串口数据的接收处理 mysql5.7的安装(已测试
    发表于 01-11 22:05

    分布式IO工业自动化数据采集与分析的核心

    生产流程进行合理分布,实现设备的就近控制和监测。这种方式的优点在于能够缩短数据传输距离、提高数据传输速度、降低故障率和提高设备利用率。 工业自动化
    发表于 12-28 14:47

    LabVIEW与Tektronix示波器实现电源测试自动化

    和Tektronix示波器解决了电源测试中的实际问题,实现了测试过程的自动化、高效和精确。这不仅显著提高了产品测试的效率和质量,也为电子产品的研发和质量
    发表于 12-09 20:37

    SpringBoot实现动态切换数据

    最近在做业务需求时,需要从不同的数据库中获取数据然后写入到当前数据库中,因此涉及到切换数据源问题。本来想着使用Mybatis-plus中提供的动态
    的头像 发表于 12-08 10:53 328次阅读
    <b class='flag-5'>SpringBoot</b><b class='flag-5'>实现</b>动态切换<b class='flag-5'>数据</b>源

    鸿蒙原生应用/元服务开发-新版本端云一体模板体验反馈

    Ability模板即可。 三、体验 新增: 最新端云一体新增“云数据库端云一体组件”, 版本对比(旧版本未加入云数据库组件) 优化:
    发表于 12-05 14:57

    元件数据库

    软件可以识别设备的元件数据库就好了,我们公司的机器数据都是用物料编码建立的
    发表于 11-16 14:39

    如何在HarmonyOS对数据库进行备份,恢复与加密

    backup接口实现数据库备份,通过restore接口实现数据库恢复,通过deletebackup接口删除数据库备份。具体接口及功能,可见​
    发表于 11-07 08:57

    关于PLC设备对接ORACLE数据库上传查询数据

    智能网关IGT-DSER方便实现PLC与数据库之间的数据通讯,既可以读取PLC的数据上报到数据库,也可以从
    发表于 10-12 15:34

    基于机器视觉和运动控制的工业自动化介绍

    运动控制 • 精确的位置控制 – 多轴协调 – 选择放置, 成形切削 – 自动化测试, DUT处理 • 精确的速度控制 – 传送带,变速电动机 • 高速I/O同步
    发表于 09-19 06:25

    RFID技术(Radio Frequency Identification射频识别)在未来的数字、信息自动化中的重要性

    制造的深入推进,工业自动化程度的不断提高,RFID(Radio Frequency Identification,射频识别)作为重要的自动识别与数据采集技术,越来越多地应用于工业领域,并与企业广泛应用
    发表于 08-16 09:12

    一款数据库自动化提权工具

    一款用Go语言编写的数据库自动化提权工具,支持Mysql、MSSQL、Postgresql、Oracle、Redis数据库提权、命令执行、爆破以及ssh连接等等功能。
    的头像 发表于 07-19 14:57 379次阅读
    一款<b class='flag-5'>数据库</b><b class='flag-5'>自动化</b>提权工具

    关于Jenkins+docker+springboot一键自动部署项目

    本文章实现最简单全面的Jenkins+docker+springboot 一键自动部署项目,步骤齐全,少走坑路。
    的头像 发表于 05-16 08:59 610次阅读
    关于Jenkins+docker+<b class='flag-5'>springboot</b>一键<b class='flag-5'>自动</b>部署项目