SpringBoot整合Flyway数据库版本管理

介绍

flyway官网

Flyway是一款数据库版本控制管理工具,支持数据库版本自动升级。

比如我们在开发过程当中,某个成员在某个表当中新增了一个字段,那么开发库和测试库的同步就需要手动去完成。
还比如某个开发成员新增了一个数据表,假如想同步数据库,那么也需要手动去完成。

现在我们就可以使用flyway来帮我们自动的去完成这个工作。

SpringBoot整合Flyway数据库版本管理_第1张图片

 

使用步骤

第一步:新建一个springboot项目,引入flyway依赖,完整pom如下



	4.0.0
	
		org.springframework.boot
		spring-boot-starter-parent
		2.2.2.RELEASE
		 
	
	com.fsl
	springboot-flyway
	0.0.1-SNAPSHOT
	springboot-flyway
	Demo project for Spring Boot

	
		1.8
	

	
		
			org.springframework.boot
			spring-boot-starter-actuator
		
		
			org.springframework.boot
			spring-boot-starter-web
		
		
			org.flywaydb
			flyway-core
		

		
			mysql
			mysql-connector-java
			runtime
		
		
			org.springframework.boot
			spring-boot-starter-test
			test
			
				
					org.junit.vintage
					junit-vintage-engine
				
			
		
		
		
			com.alibaba
			fastjson
			1.2.6
		

		
			org.springframework.boot
			spring-boot-starter-jdbc
		
	

	
		
			
				org.springframework.boot
				spring-boot-maven-plugin
			
			
				org.flywaydb
				flyway-maven-plugin
				
					root
					123456
					com.mysql.cj.jdbc.Driver
					jdbc:mysql://127.0.0.1:3307/springboot?serverTimezone=GMT
					true
					
					classpath:db/migration/
				
			
		
	


第二步:修改配置文件

#运行端口号
server.port=8084

#应用名称
spring.application.name=springboot-flyway

#################################### jdbc_config   datasource ##################################
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# spring.datasource.url=jdbc:mysql://localhost:3306/springboot?useSSL=false&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true
# 按照上面的数据源配置,会报时区错误,所以必须加上serverTimezone的信息
# 报错信息为:The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone
spring.datasource.url=jdbc:mysql://localhost:3307/springboot?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456
# Hikari will use the above plus the following to setup connection pooling
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.maximum-pool-size=15
spring.datasource.hikari.auto-commit=true
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.pool-name=DatebookHikariCP
spring.datasource.hikari.max-lifetime=1800000
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.connection-test-query=SELECT 1


#################################### Actuator相关设置 ##################################
#开放所有页面节点  默认只开启了health、info两个节点
management.endpoints.web.exposure.include=*
#显示健康具体信息  默认不会显示详细信息
management.endpoint.health.show-details=always



#################################### flyway相关设置 ##################################
#是否开启flyway
spring.flyway.enabled=true
#迁移脚本的路径
spring.flyway.locations=classpath:db/migration
#检查迁移脚本的位置是否存在
spring.flyway.check-location=true
#当迁移时发现目标schema非空,而且带有没有元数据的表时,是否自动执行基准迁移,默认false.
spring.flyway.baseline-on-migrate=true

#flyway.baseline-description对执行迁移时基准版本的描述.
#flyway.baseline-on-migrate当迁移时发现目标schema非空,而且带有没有元数据的表时,是否自动执行基准迁移,默认false.
#flyway.baseline-version开始执行基准迁移时对现有的schema的版本打标签,默认值为1.
#flyway.check-location检查迁移脚本的位置是否存在,默认false.
#flyway.clean-on-validation-error当发现校验错误时是否自动调用clean,默认false.
#flyway.enabled是否开启flywary,默认true.
#flyway.encoding设置迁移时的编码,默认UTF-8.
#flyway.ignore-failed-future-migration当读取元数据表时是否忽略错误的迁移,默认false.
#flyway.init-sqls当初始化好连接时要执行的SQL.
#flyway.locations迁移脚本的位置,默认db/migration.
#flyway.out-of-order是否允许无序的迁移,默认false.
#flyway.password目标数据库的密码.
#flyway.placeholder-prefix设置每个placeholder的前缀,默认${.
#flyway.placeholder-replacementplaceholders是否要被替换,默认true.
#flyway.placeholder-suffix设置每个placeholder的后缀,默认}.
#flyway.placeholders.[placeholder name]设置placeholder的value
#flyway.schemas设定需要flywary迁移的schema,大小写敏感,默认为连接默认的schema.
#flyway.sql-migration-prefix迁移文件的前缀,默认为V.
#flyway.sql-migration-separator迁移脚本的文件名分隔符,默认__
#flyway.sql-migration-suffix迁移脚本的后缀,默认为.sql
#flyway.tableflyway使用的元数据表名,默认为schema_version
#flyway.target迁移时使用的目标版本,默认为latest version
#flyway.url迁移时使用的JDBC URL,如果没有指定的话,将使用配置的主数据源
#flyway.user迁移数据库的用户名
#flyway.validate-on-migrate迁移时是否校验,默认为true.

第三步:在resource目录下面建立db.migration目录,里面放置我们变动的sql文件

sql脚本的格式:V+版本号+双下划线+秒速+结束符

例如:
V1.1__test.sql
V20190429.1530__ops_update.sql 
V1__INIT_DATABASE.sql

SpringBoot整合Flyway数据库版本管理_第2张图片

 启动项目之后,我们就会发现我们的sql文件已经自动的执行了,并且会生成一个flyway_schema_history数据表。

flyway在第一次运行的时候,会在数据库当中建立一个flyway_schema_history数据表,这个数据表用来记录每一次版本变更的信息。

SpringBoot整合Flyway数据库版本管理_第3张图片

上面我们是启动项目让脚本自动执行,假如我们不想启动项目,我们可以使用flyway-maven-plugin来进行操作(我们在上面已经为插件配置了数据库连接的信息)

BaseLine:对已经存在数据库Schema结构的数据库一种解决方案。实现在非空数据库新建MetaData表,并把
Migrations应用到该数据库;也可以应用到已有表结构的数据库中也可以实现添加Metadata表。

Clean:清除掉对应数据库Schema中所有的对象,包括表结构,视图,存储过程等,clean操作在dev 和 test阶
段很好用

Info:用于打印所有的Migrations的详细和状态信息,也是通过MetaData和Migrations完成的,可以快速定位
当前的数据库版本

Migrate:首先检测MetaData表是否生成,没有生成自动生成,然后会扫描指定sql文件并与MetaData中的记录
进行对比,进行版本升级

repair:修复metaData表

Undo:撤销到上一个数据库的版本

Validate:验证以及apply的Migrations是否有变更,默认开启的;原理是对比MetaData表与本地Migrations的
checkNum值,如果值相同则验证通过,否则失败。

SpringBoot整合Flyway数据库版本管理_第4张图片

我们看网上的教程这个插件的pom如下:


    org.flywaydb
    flyway-maven-plugin
    5.0.3

执行之后会出现下面的错误

[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.flywaydb:flyway-maven-plugin:5.0.3:clean (default-cli) 
on project springboot-flyway: org.flywaydb.core.api.FlywayException: Unable to connect to
the database. Configure the url, user and password! -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException

正常的执行结果如下:

SpringBoot整合Flyway数据库版本管理_第5张图片

你可能感兴趣的:(SpringBoot)