首页 / 知识
SpringBoot 04 集成Flyway实现数据库版本控制
2023-04-11 16:20:00

1. 为什么使用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
官网链接:Homepage - Flyway
Flyway是如何工作的?可以查看之前的一篇译文,这里就不再重复了,本文主要介绍Springboot如何集成flyway
【译文】数据库管理工具Flyway_学然后知不足!-CSDN博客
2.SpringBoot集成Flyway
2.1 简单示例
参考版本信息
示例信息 版本
springboot 2.6.2
flyway 7.15.0
mysql 5.7.30
参考目录结构
1. 创建SpringBoot应用,并添加flyway-core依赖,本例中将实现初始化脚本到mysql数据库,因此同时引入了驱动依赖 mysql-connector-java
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>7.15.0</version>
</dependency>
参考pom.xml依赖如下
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>7.15.0</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.8.2</version>
<scope>test</scope>
</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
## 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脚本内容
create table PERSON (
ID int not null,
NAME varchar(100) not null
);
//V1.20190621.1904__INIT_PERSION.sql 脚本内容
insert into PERSON (ID, NAME) values (1, 'Axel');
insert into PERSON (ID, NAME) values (2, 'Mr. Foo');
insert into PERSON (ID, NAME) values (3, 'Ms. Bar');
sql 目录中存放脚本文件,脚本名称命名方式
版本化迁移: 执行一遍,版本号唯一,有重复会报错: 格式:V+版本号 +双下划线+描述+结束符
重复的迁移,不需要版本号,脚本发生变化启动就会执行: 格式:R+双下划线+描述+结束符
撤消迁移: 格式:U+版本号 +双下划线+描述+结束符
4. 运行启动主类,运行日志如下,从日志中可以看到如下信息
启动后正确链接到数据库runoob
验证2个迁移脚本成功
使用命令行的方式创建了一张名称为 flyway_schema_history 的记录表,这里要注意,所有脚本一旦执行了就会在 flyway_schema_history中创建记录, 如果出错引发问题,可以删除表中记录,反正启动的时候还会再执行,当然生产环境不建议此方法,但生产环境上部署的包都是验证过无问题的包也不会出现此问题
执行了resource/db.migration 目录下的两个脚本,并执行成功
INFO 190688 --- [ main] o.f.c.internal.license.VersionPrinter : Flyway Community Edition 7.15.0 by Redgate
INFO 190688 --- [ main] o.f.c.i.database.base.BaseDatabaseType : Database: jdbc:mysql://127.0.0.1:3306/runoob (MySQL 5.7)
INFO 190688 --- [ main] o.f.core.internal.command.DbValidate : Successfully validated 2 migrations (execution time 00:00.016s)
INFO 190688 --- [ main] o.f.c.i.s.JdbcTableSchemaHistory : Creating Schema History table ——runoob——。——flyway_schema_history—— with baseline …
INFO 190688 --- [ main] o.f.core.internal.command.DbBaseline : Successfully baselined schema with version: 1
INFO 190688 --- [ main] o.f.core.internal.command.DbMigrate : Current version of schema ——runoob——: 1
INFO 190688 --- [ main] o.f.core.internal.command.DbMigrate : Migrating schema ——runoob—— to version "1.20190621.1854 - CREATE PERSION TABLE"
INFO 190688 --- [ main] o.f.core.internal.command.DbMigrate : Migrating schema ——runoob—— to version "1.20190621.1904 - INIT PERSION"
INFO 190688 --- [ main] o.f.core.internal.command.DbMigrate : Successfully applied 2 migrations to schema ——runoob——, now at version v1.20190621.1904 (execution time 00:00.225s)
停止服务后,重新运行日志如下,从日志中可以看到信息
启动后正确链接到数据库runoob
验证2个迁移脚本成功
本次没有重复执行脚本, 日志中打印当前脚本编号20190621.1904, 即最后1次执行的脚本
INFO 193184 --- [ main] o.f.c.internal.license.VersionPrinter : Flyway Community Edition 7.15.0 by Redgate
INFO 193184 --- [ main] o.f.c.i.database.base.BaseDatabaseType : Database: jdbc:mysql://127.0.0.1:3306/runoob (MySQL 5.7)
INFO 193184 --- [ main] o.f.core.internal.command.DbValidate : Successfully validated 3 migrations (execution time 00:00.024s)
INFO 193184 --- [ main] o.f.core.internal.command.DbMigrate : Current version of schema ——runoob——: 1.20190621.1904
INFO 193184 --- [ main] o.f.core.internal.command.DbMigrate : Schema ——runoob—— is up to date. No migration necessary.
查看Mysql数据库
2.2 常见问题
1.Caused by: org.flywaydb.core.api.FlywayException: Found non-empty schema(s)
Caused by: org.flywaydb.core.api.FlywayException: Found non-empty schema(s) ——runoob—— but no schema history table. Use baseline() or set baselineOnMigrate to true to initialize the schema history table.
at org.flywaydb.core.Flyway$1.execute(Flyway.java:200) ——[flyway-core-7.15.0.jar:na]
at org.flywaydb.core.Flyway$1.execute(Flyway.java:170) ——[flyway-core-7.15.0.jar:na]
at org.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
Caused by: org.flywaydb.core.api.FlywayException: Unsupported Database: MySQL 5.7
at org.flywaydb.core.internal.database.DatabaseTypeRegister.getDatabaseTypeForConnection(DatabaseTypeRegister.java:106) ——[flyway-core-8.4.2.jar:na]
at org.flywaydb.core.internal.jdbc.JdbcConnectionFactory.<init>(JdbcConnectionFactory.java:75) ——[flyway-core-8.4.2.jar:na]
at org.flywaydb.core.FlywayExecutor.execute(FlywayExecutor.java:143) ——[flyway-core-8.4.2.jar:na]
at org.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 源码参考
链接: 源码参考Demo-flyway
文章总结
本文介绍了Springboot集成flyway方式
使用Flyway之前部署脚本方式一般为开发人员按照顺序汇总数据库的升级脚, 然后DBA或者售后在生产库中按照顺序执行升级脚本。
使用Flyway之后部署脚本方式就变更为开发人员将脚本构建到程序包中, 部署程序包后启动时Flyway自动执行脚本升级
前一篇: SpringBoot 03 事件监听处理
文章知识点与官方知识档案匹配,可进一步学习相关知识
Java技能树使用JDBC操作数据库JDBC概述6686 人正在系统学习中
|
最新内容
相关内容
Python实现批量文件的压缩处理
Python实现批量文件的压缩处理,项目,信息,分析,数据,软件,培训,文件夹,文件,源文件,目标,一、前言接到项目求助,需要对上千个文件夹中的文件进Python区块链的简易实现
Python区块链的简易实现,区块链,代码,数据,技术,交易,智能,合约,区块,业务,新增,区块链技术因为比特币的火爆而广受关注,我们这里用python代码Python 中如何实现参数化测试?
Python 中如何实现参数化测试?,密码,数据,测试,业务,情况,预期,培训,系统,参数,方法,之前,我曾转过一个单元测试框架系列的文章,里面介绍了unitPython元类之通过元类实现数据库OR
Python元类之通过元类实现数据库ORM框架,数据,名称,信息,代码,主体,当中,字段,分析,一致,投入,ORM框架是什么如果是没有做过后端的小伙伴上来python unittest控制用例的执行顺
python unittest控制用例的执行顺序,名字,交易,培训,方法,顺序,测试,方式,功能,订单,接口,为什么要进行顺序控制呢?使用过testng的同学就知道简述Python数据库三大范式?
简述Python数据库三大范式?,数据,设计,公司,信息,培训,数据库,字段,范式,订单,关系,python数据库的三大特性:实体:表属性:表中的数据(字段)关系Python k-近邻算法的实现原理
Python k-近邻算法的实现原理,数据,样本,分析,收费,时间,流程,培训,算法,子树,近邻,1.KNN算法流程步骤(1)收集数据:可以使用任何方法。包括爬python中实现字符与ascll码相互转
python中实现字符与ascll码相互转换方法,代码,培训,字符,函数,方法,实例,字符串,本文,以上,更多,在编程中,我们常常会给代码加密。如果是进行python如何导入txt数据库?
python如何导入txt数据库?,数据,时间,代码,培训,数据库,函数,读数,数据表,以上,方法,python将TXT数据导入数据库的方法代码如下:#!/usr/bin/pypython实现报表用什么?
python实现报表用什么?,工具,工作,培训,报表,内容,参数,语言,终端,矩阵,语句,python中可以使用xlwt与xlrd库读写Excel报表。xlwtPython语言中python如何实现换行?
python如何实现换行?,培训,结果,字符,以上,方法,更多,内容,python实现换行的方法:1、使用换行符“\n”实现换行#-*-coding:utf-8-*-A="来python如何控制内存
python如何控制内存,名称,情况,系统,定期,管理,数字,数据,培训,对象,内存,python控制内存的方法:一、对象的引用计数机制二、垃圾回收机制三、