

@toc
我的springboot版本为2.7.5Flyway是一个款数据库版本管理工具,它可以很方便的在命令行中使用,或者在Java应用程序中引入,用于管理我们的数据库版本。Flyway可以实现启动项目时自动执行项目迭代升级所需Sql语句,从而减少升级项目时人工干预成本。Flyway最核心的就是用于记录所有版本演化和状态的MetaData表,Flyway首次启动会创建默认名为SCHEMA_VERSION的元素局表。 表中保存了版本,描述,要执行的sql脚本等。MetaData表就是
元数据表,就是flyway_schema_history


flyway官方文档:https://flywaydb.org/documentation/
在多人开发的项目中,我们都习惯了使用SVN或者Git来对代码做版本控制,主要的目的就是为了解决多人开发代码冲突和版本回退的问题。
其实,数据库的变更也需要版本控制,在日常开发中,我们经常会遇到下面的问题:
1.自己写的SQL忘了在所有环境执行。
2.别人写的SQL我们不能确定是否都在所有环境执行过了。
3.有人修改了已经执行过的SQL,期望再次执行。
4.需要新增环境做数据迁移。
5.每次发版需要手动控制先发DB版本,再发布应用版本。
6.其它场景。
有了flyway,这些问题都能得到很好的解决。
flyway工作流程如下:
1.项目启动,应用程序完成数据库连接池的建立后,Flyway自动运行。
2.初次使用时,flyway会创建一个 flyway_schema_history 表,用于记录sql执行记录。
3.Flyway会扫描项目指定路径下(默认是 classpath:db/migration )的所有sql脚本,与 flyway_schema_history 表脚本记录进行比对。如果数据库记录执行过的脚本记录,与项目中的sql脚本不一致,Flyway会报错并停止项目执行。
4.如果校验通过,则根据表中的sql记录最大版本号,忽略所有版本号不大于该版本的脚本。再按照版本号从小到大,逐个执行其余脚本。
格式: V + 版本号 + __ (双下划线) + 描述.sql

V20221104_10001.sql(推荐这种命名方式,其中20221102代表日期,10001代表SVN或者Git的提交版本号,便于迭代)
- V20221104_10001__add.sql(也推荐使用这种,双下划线后面加点描述词)版本迁移:
以V开头的文件
最常见的迁移就是就是版本化迁移,每次迁移都会对应的迁移版本,迁移的版本必须全局唯一,版本迁移最大的特点就是依次只被执行依次。
撤销迁移:
以U开头的文件(这个U开头的撤销文件我没玩明白如何使用,后续研究明白了再补上)
每个撤销迁移都对应的一个版本迁移,也就是说撤销迁移是针对版本迁移所存在的,每一个撤销迁移与版本迁移都是一一对应的,而且对应的版本号必须一致。
可重复迁移:
以R开头的文件
可重复迁移有描述和校验码,但是没有版本号,程序在每次启动的时候,如果发现脚本文件有变化就会执行。
基于 SQL 的迁移
上面提到的几种类型都是基于 SQL 文件来执行的,只不过每种类型的命名格式不一样,下图是从官网上截下来的,大家看下每种类型的文件应该按照如下的格式去命令,其中的 Separator 是两个下划线。

主要分为下面几个部分:
prefix:前缀,不同的类型采用不同的前缀,版本迁移使用 V,撤销迁移使用 U,可重复迁移使用 R,当然这些都是可配置的;
Version:版本号,可以使用点符号或者单下划线链接;
Separator:分隔符,两个下划线,也是可以配置的;
Description:版本描述可以用下划线和空格分隔;
Suffix:后缀,一般都是 .sql
1)Flyway 会扫描配置的脚本目录下的脚本文件;
2)如果历史记录表不存在,则新建历史记录表;
3)如果是一次性执行脚本(V),按版本号从小到大执行迁移脚本,与当前历史表中的版本号做对比,大于当前版本号的脚本才会被执行迁移;
4)如果是可重复执行脚本(R),检查脚本是否有变动,有变动的可重复脚本才会被执行迁移;
1.Fayway在每次应用启动时检测是否有需要执行的升级脚本;
2.文件名以V作为前缀的,后跟版本号,版本号格式可以为为大版本号(1、2),也可以包含小版本号(1.1或1_1),但是需统一,不能有些有小版本号,有些没有;
3.前缀为V的脚本不可重复执行,每个脚本只会被执行一次。已经执行过的历史版本脚本不能再修改,除非清除flayway的历史记录,重新执行升级脚本,这在生产环境不允许。
前缀为R的脚本,后面无版本号,如R__update_version.sql,可以重复执行,每次内容发生变化时重启后就会执行。
4. Flyway需要创建存储脚本升级记录用的表,因此需要建表权限,也可以事先建好。默认表名为flyway_schema_history;

第1步:引入pom
<dependencies>
<!--解决@RestController注解爆红-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring.boot.starter.web.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
<!--使用flyway-->
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>${flayway.test.version}</version>
</dependency>
<!--mysql相关-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
<version>${mysql.connector.java.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<version>${spring.boot.starter.jdbc.version}</version>
</dependency>
<!--
必须配置相关slf4j的依赖,否则启动报错:说缺少日志框架的相关实现。
注意:必须设置1.7.x及之前的版本,如果输入2.0.x版本会报错:SLF4J: Class path contains SLF4J bindings targeting slf4j-api versions 1.7.x or earlier
-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.api.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.log4j12.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-maven-plugin</artifactId>
<version>${flayway.test.version}</version>
<configuration>
<user>root</user>
<password>123456</password>
<driver>com.mysql.jdbc.Driver</driver>
<url>jdbc:mysql://10.110.13.86:3306/flyway?characterEncoding=utf8</url>
<baselineOnMigrate>true</baselineOnMigrate>
<!--sql脚本位置,flyway会自动去找到这个目录并且执行里面的sql脚本-->
<locations>classpath:db/migration/</locations>
</configuration>
</plugin>
</plugins>
</build>我的项目是父模块模式,所以版本号在父pom中指定
<properties>
<spring.boot.starter.web.version>2.6.3</spring.boot.starter.web.version>
<lombok.version>1.18.22</lombok.version>
<flayway.test.version>6.5.7</flayway.test.version>
<mysql.connector.java.version>8.0.31</mysql.connector.java.version>
<spring.boot.starter.jdbc.version>2.7.5</spring.boot.starter.jdbc.version>
<slf4j.api.version>1.7.33</slf4j.api.version>
<slf4j.log4j12.version>1.7.33</slf4j.log4j12.version>
</properties># 端口号
server:
port: 8015
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://10.110.13.86:3306/flyway?characterEncoding=utf8
username: root
password: 123456
hikari:
minimum-idle: 5 #最小空闲连接数
idle-timeout: 180000 #空闲连接存活最大时间,默认600000
maximum-pool-size: 10 #连接池最大连接数
auto-commit: true #自动提交 默认true
pool-name: HikariCP #连接池名称
max-lifetime: 1800000 #连接池最长生命周期,0表示无限生命周期,默认1800000(30分钟)
connection-timeout: 30000 #连接超时时间,默认30000
connection-test-query: SELECT 1
# flayway相关配置
flyway:
locations: classpath:db/migration #这个路径指的是fly版本控制的sql语句存放的路径,可以多个,可以给每个环境使用不同位置,比如classpath:db/migration,classpath:test/db/migration
baseline-on-migrate: true #开启自动创建flyway元数据表标识 默认: false
enabled: true #是否启用flyway(默认true)
clean-disabled: true #禁止flyway执行清理
table: flyway_schema_history #用于记录所有的版本变化记录就是写了1个简单的create创建语句、以及insert添加、update修改语句
V1.0__create_flyway_test_table.sql
CREATE TABLE flyway_test_table (
engine_name VARCHAR(64) NOT NULL COLLATE 'utf8_general_ci',
device_type INT(11) NOT NULL,
cost_name VARCHAR(64) NOT NULL,
cost_value FLOAT NULL DEFAULT NULL,
last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
comment VARCHAR(1024) NULL DEFAULT NULL,
PRIMARY KEY (engine_name) USING BTREE
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB;V1.1__add_flyway_test_table.sql
INSERT INTO flyway_test_table (engine_name, device_type, cost_name, cost_value, last_update, comment) VALUES ('34000', 0, 'io_block_read_cost', NULL, '2022-10-21 03:32:08', NULL);
INSERT INTO flyway_test_table (engine_name, device_type, cost_name, cost_value, last_update, comment) VALUES ('34003', 0, 'io_block_read_cost', NULL, '2022-10-21 03:32:08', NULL);V20221101__10381.sql
INSERT INTO flyway_test_table (engine_name, device_type, cost_name, cost_value, last_update, comment) VALUES ('34001', 0, 'io_block_read_cost', NULL, '2022-10-21 03:32:08', NULL);R__10382.sql
UPDATE flyway_test_table set engine_name='34005' where engine_name = '34000';package com.flyway;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* Spring Boot使用flayway自动执行数据库升级脚本
* @Author 211145187
* @Date 2022/9/20 14:33
**/
@SpringBootApplication
public class FlaywayApplication {
public static void main(String[] args) {
SpringApplication.run(FlaywayApplication.class, args);
}
}项目启动后控制台日志打印
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.6.3)
2022-11-01 13:34:01.873 INFO 21004 --- [ main] com.flyway.FlaywayApplication : Starting FlaywayApplication using Java 1.8.0_71 on HYT211145187-01 with PID 21004 (G:\WorkSpace\springboot-test\flyway-test\target\classes started by 211145187 in G:\WorkSpace\springboot-test)
2022-11-01 13:34:01.876 INFO 21004 --- [ main] com.flyway.FlaywayApplication : No active profile set, falling back to default profiles: default
2022-11-01 13:34:02.861 INFO 21004 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8015 (http)
2022-11-01 13:34:02.898 INFO 21004 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2022-11-01 13:34:02.899 INFO 21004 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.56]
2022-11-01 13:34:03.005 INFO 21004 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2022-11-01 13:34:03.005 INFO 21004 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1086 ms
2022-11-01 13:34:03.400 INFO 21004 --- [ main] o.f.c.internal.license.VersionPrinter : Flyway Community Edition 6.5.7 by Redgate
2022-11-01 13:34:03.405 INFO 21004 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariCP - Starting...
2022-11-01 13:34:13.747 INFO 21004 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariCP - Start completed.
2022-11-01 13:34:13.766 INFO 21004 --- [ main] o.f.c.internal.database.DatabaseFactory : Database: jdbc:mysql://10.110.13.86:3306/mysql (MySQL 5.7)
2022-11-01 13:34:13.822 INFO 21004 --- [ main] o.f.core.internal.command.DbValidate : Successfully validated 2 migrations (execution time 00:00.029s)
2022-11-01 13:34:13.832 INFO 21004 --- [ main] o.f.core.internal.command.DbMigrate : Current version of schema `mysql`: << Empty Schema >>
2022-11-01 13:34:13.847 INFO 21004 --- [ main] o.f.core.internal.command.DbMigrate : Migrating schema `mysql` to version 1.0 - create flyway test table
2022-11-01 13:34:13.884 INFO 21004 --- [ main] o.f.core.internal.command.DbMigrate : Migrating schema `mysql` to version 1.1 - add flyway test table
2022-11-01 13:34:13.901 INFO 21004 --- [ main] o.f.core.internal.command.DbMigrate : Successfully applied 2 migrations to schema `mysql` (execution time 00:00.075s)
2022-11-01 13:34:14.004 INFO 21004 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8015 (http) with context path ''
2022-11-01 13:34:14.013 INFO 21004 --- [ main] com.flyway.FlaywayApplication : Started FlaywayApplication in 12.628 seconds (JVM running for 13.458)
Process finished with exit code -1flyway库下的表结构

flyway_schema_history

flyway_test_table

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.详情错误日志
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.6.3)
2022-11-01 14:50:33.363 INFO 26596 --- [ main] com.flyway.FlaywayApplication : Starting FlaywayApplication using Java 1.8.0_71 on HYT211145187-01 with PID 26596 (G:\WorkSpace\springboot-test\flyway-test\target\classes started by 211145187 in G:\WorkSpace\springboot-test)
2022-11-01 14:50:33.366 INFO 26596 --- [ main] com.flyway.FlaywayApplication : No active profile set, falling back to default profiles: default
2022-11-01 14:50:34.336 INFO 26596 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8015 (http)
2022-11-01 14:50:34.372 INFO 26596 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2022-11-01 14:50:34.373 INFO 26596 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.56]
2022-11-01 14:50:34.460 INFO 26596 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2022-11-01 14:50:34.460 INFO 26596 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1052 ms
2022-11-01 14:50:34.839 INFO 26596 --- [ main] o.f.c.internal.license.VersionPrinter : Flyway Community Edition 6.5.7 by Redgate
2022-11-01 14:50:34.844 INFO 26596 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariCP - Starting...
2022-11-01 14:50:45.205 INFO 26596 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariCP - Start completed.
2022-11-01 14:50:45.225 INFO 26596 --- [ main] o.f.c.internal.database.DatabaseFactory : Database: jdbc:mysql://10.110.13.86:3306/flyway (MySQL 5.7)
2022-11-01 14:50:45.297 WARN 26596 --- [ main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Invocation of init method failed; nested exception is java.lang.reflect.InvocationTargetException
2022-11-01 14:50:45.297 INFO 26596 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariCP - Shutdown initiated...
2022-11-01 14:50:45.301 INFO 26596 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariCP - Shutdown completed.
2022-11-01 14:50:45.305 INFO 26596 --- [ main] o.apache.catalina.core.StandardService : Stopping service [Tomcat]
2022-11-01 14:50:45.314 INFO 26596 --- [ main] ConditionEvaluationReportLoggingListener :
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2022-11-01 14:50:45.343 ERROR 26596 --- [ main] o.s.boot.SpringApplication : Application run failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Invocation of init method failed; nested exception is java.lang.reflect.InvocationTargetException
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1804) ~[spring-beans-5.3.15.jar:5.3.15]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:620) ~[spring-beans-5.3.15.jar:5.3.15]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) ~[spring-beans-5.3.15.jar:5.3.15]
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.15.jar:5.3.15]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.15.jar:5.3.15]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.15.jar:5.3.15]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.15.jar:5.3.15]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:322) ~[spring-beans-5.3.15.jar:5.3.15]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.15.jar:5.3.15]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:953) ~[spring-beans-5.3.15.jar:5.3.15]
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918) ~[spring-context-5.3.15.jar:5.3.15]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) ~[spring-context-5.3.15.jar:5.3.15]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145) ~[spring-boot-2.6.3.jar:2.6.3]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:732) [spring-boot-2.6.3.jar:2.6.3]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:414) [spring-boot-2.6.3.jar:2.6.3]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:302) [spring-boot-2.6.3.jar:2.6.3]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303) [spring-boot-2.6.3.jar:2.6.3]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292) [spring-boot-2.6.3.jar:2.6.3]
at com.flyway.FlaywayApplication.main(FlaywayApplication.java:14) [classes/:na]
Caused by: java.lang.reflect.InvocationTargetException: null
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_71]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_71]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_71]
at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_71]
at org.springframework.boot.autoconfigure.flyway.FlywayMigrationInitializer.afterPropertiesSet(FlywayMigrationInitializer.java:70) ~[spring-boot-autoconfigure-2.6.3.jar:2.6.3]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1863) ~[spring-beans-5.3.15.jar:5.3.15]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1800) ~[spring-beans-5.3.15.jar:5.3.15]
... 18 common frames omitted
Caused by: org.flywaydb.core.api.FlywayException: Validate failed:
Migration checksum mismatch for migration version 1.1
-> Applied to database : 1332862643
-> Resolved locally : -826751737
at org.flywaydb.core.Flyway.doValidate(Flyway.java:292) ~[flyway-core-6.5.7.jar:na]
at org.flywaydb.core.Flyway.access$100(Flyway.java:73) ~[flyway-core-6.5.7.jar:na]
at org.flywaydb.core.Flyway$1.execute(Flyway.java:166) ~[flyway-core-6.5.7.jar:na]
at org.flywaydb.core.Flyway$1.execute(Flyway.java:158) ~[flyway-core-6.5.7.jar:na]
at org.flywaydb.core.Flyway.execute(Flyway.java:527) ~[flyway-core-6.5.7.jar:na]
at org.flywaydb.core.Flyway.migrate(Flyway.java:158) ~[flyway-core-6.5.7.jar:na]
... 25 common frames omitted
Process finished with exit code 1报错原因:修改了已经执行过的迁移文件,比如V开头的叫V1.1__add_flyway_test_table.sql这个名字的文件,重新执行这个更改的迁移文件时就会产生新的校验和“checkSum"与原来校验和不符合,导致报该错误,原则上不可以直接修改已经执行的迁移文件,要修改需要新建迁移文件进行修改。
举例说明:比如最开始我有个文件V1.1add_flyway_test_table.sql,里面有个insert插入一条数据的sql,然后我启动整个项目,执行sql插入一条数据,且V开头的文件按常理已经执行过一次了,后面压根不会再次执行,但我手欠儿,再次对V开头的文件V1.1add_flyway_test_table.sql进行修改或者新增几条sql,然后再次启动项目就会报错误5的错误了。
解决方案:
1)方案1(不推荐):涉及的2张表flyway_schema_history和flyway_test_table都删除,这会造成已有的数据丢失、混乱。2)方案2(推荐):可以使用Flyway Maven 插件,双击运行:flyway:repair ,修复该错误,再重新执行:flyway:migrate。这样项目就能再次启动。3)方案3(不推荐):删除2张表flyway_schema_history和flyway_test_table,然后重新启动项目把所有sql脚本从头到尾执行一遍。缺点:万一数据量太大太耗时,甚至可能出错。碰到个问题:原来的V1.1add_flyway_test_table.sql里面有个内容,然后我对它修改后,执行flyway:repair,在执行flyway:migrate后,再次启动项目发现V1.1add_flyway_test_table.sql新增的内容没有执行?数据库没有产生新数据?
答案:应该是不会执行的,除非新增个V开头的迁移文件才会执行,即:对已经执行过的V开头的迁移文件修改后也不会执行,需要新建迁移文件进行修改才会生效。
详情错误日志
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.6.3)
2022-11-01 16:38:17.063 INFO 18260 --- [ main] com.flyway.FlaywayApplication : Starting FlaywayApplication using Java 1.8.0_71 on HYT211145187-01 with PID 18260 (G:\WorkSpace\springboot-test\flyway-test\target\classes started by 211145187 in G:\WorkSpace\springboot-test)
2022-11-01 16:38:17.064 INFO 18260 --- [ main] com.flyway.FlaywayApplication : No active profile set, falling back to default profiles: default
2022-11-01 16:38:18.093 INFO 18260 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8015 (http)
2022-11-01 16:38:18.126 INFO 18260 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2022-11-01 16:38:18.126 INFO 18260 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.56]
2022-11-01 16:38:18.215 INFO 18260 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2022-11-01 16:38:18.215 INFO 18260 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1101 ms
2022-11-01 16:38:18.597 WARN 18260 --- [ main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'flyway' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.flywaydb.core.Flyway]: Factory method 'flyway' threw exception; nested exception is java.lang.BootstrapMethodError: java.lang.NoSuchMethodError: org.flywaydb.core.api.configuration.FluentConfiguration.ignoreMissingMigrations(Z)Lorg/flywaydb/core/api/configuration/FluentConfiguration;
2022-11-01 16:38:18.602 INFO 18260 --- [ main] o.apache.catalina.core.StandardService : Stopping service [Tomcat]
2022-11-01 16:38:18.609 INFO 18260 --- [ main] ConditionEvaluationReportLoggingListener :
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2022-11-01 16:38:18.634 ERROR 18260 --- [ main] o.s.boot.SpringApplication : Application run failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'flyway' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.flywaydb.core.Flyway]: Factory method 'flyway' threw exception; nested exception is java.lang.BootstrapMethodError: java.lang.NoSuchMethodError: org.flywaydb.core.api.configuration.FluentConfiguration.ignoreMissingMigrations(Z)Lorg/flywaydb/core/api/configuration/FluentConfiguration;
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:658) ~[spring-beans-5.3.15.jar:5.3.15]
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:638) ~[spring-beans-5.3.15.jar:5.3.15]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1352) ~[spring-beans-5.3.15.jar:5.3.15]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1195) ~[spring-beans-5.3.15.jar:5.3.15]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) ~[spring-beans-5.3.15.jar:5.3.15]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) ~[spring-beans-5.3.15.jar:5.3.15]
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.15.jar:5.3.15]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.15.jar:5.3.15]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.15.jar:5.3.15]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.15.jar:5.3.15]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:322) ~[spring-beans-5.3.15.jar:5.3.15]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.15.jar:5.3.15]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:953) ~[spring-beans-5.3.15.jar:5.3.15]
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918) ~[spring-context-5.3.15.jar:5.3.15]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) ~[spring-context-5.3.15.jar:5.3.15]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145) ~[spring-boot-2.6.3.jar:2.6.3]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:732) [spring-boot-2.6.3.jar:2.6.3]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:414) [spring-boot-2.6.3.jar:2.6.3]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:302) [spring-boot-2.6.3.jar:2.6.3]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303) [spring-boot-2.6.3.jar:2.6.3]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292) [spring-boot-2.6.3.jar:2.6.3]
at com.flyway.FlaywayApplication.main(FlaywayApplication.java:14) [classes/:na]
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.flywaydb.core.Flyway]: Factory method 'flyway' threw exception; nested exception is java.lang.BootstrapMethodError: java.lang.NoSuchMethodError: org.flywaydb.core.api.configuration.FluentConfiguration.ignoreMissingMigrations(Z)Lorg/flywaydb/core/api/configuration/FluentConfiguration;
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185) ~[spring-beans-5.3.15.jar:5.3.15]
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653) ~[spring-beans-5.3.15.jar:5.3.15]
... 21 common frames omitted
Caused by: java.lang.BootstrapMethodError: java.lang.NoSuchMethodError: org.flywaydb.core.api.configuration.FluentConfiguration.ignoreMissingMigrations(Z)Lorg/flywaydb/core/api/configuration/FluentConfiguration;
at org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration$FlywayConfiguration.configureIgnoredMigrations(FlywayAutoConfiguration.java:273) ~[spring-boot-autoconfigure-2.6.3.jar:2.6.3]
at org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration$FlywayConfiguration.configureProperties(FlywayAutoConfiguration.java:213) ~[spring-boot-autoconfigure-2.6.3.jar:2.6.3]
at org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration$FlywayConfiguration.flyway(FlywayAutoConfiguration.java:119) ~[spring-boot-autoconfigure-2.6.3.jar:2.6.3]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_71]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_71]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_71]
at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_71]
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ~[spring-beans-5.3.15.jar:5.3.15]
... 22 common frames omitted
Caused by: java.lang.NoSuchMethodError: org.flywaydb.core.api.configuration.FluentConfiguration.ignoreMissingMigrations(Z)Lorg/flywaydb/core/api/configuration/FluentConfiguration;
at java.lang.invoke.MethodHandleNatives.resolve(Native Method) ~[na:1.8.0_71]
at java.lang.invoke.MemberName$Factory.resolve(MemberName.java:962) ~[na:1.8.0_71]
at java.lang.invoke.MemberName$Factory.resolveOrFail(MemberName.java:987) ~[na:1.8.0_71]
at java.lang.invoke.MethodHandles$Lookup.resolveOrFail(MethodHandles.java:1390) ~[na:1.8.0_71]
at java.lang.invoke.MethodHandles$Lookup.linkMethodHandleConstant(MethodHandles.java:1746) ~[na:1.8.0_71]
at java.lang.invoke.MethodHandleNatives.linkMethodHandleConstant(MethodHandleNatives.java:477) ~[na:1.8.0_71]
... 30 common frames omitted
Process finished with exit code 1错误原因:之前测试flyway-core的版本设置6.5.7就可以正常启动,当使用高版本号比如设置9.6.0时就报如上的错误,感觉就是版本设置高了导致的问题,具体为啥目前不清楚,只要把flyway版本设置成5.2.1或者6.5.7版本以及之间的版本那都是可以运行的。
详情错误日志
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.6.3)
2022-11-02 09:54:21.609 INFO 11444 --- [ main] com.flyway.FlaywayApplication : Starting FlaywayApplication using Java 1.8.0_71 on HYT211145187-01 with PID 11444 (G:\WorkSpace\springboot-test\flyway-test\target\classes started by 211145187 in G:\WorkSpace\springboot-test)
2022-11-02 09:54:21.613 INFO 11444 --- [ main] com.flyway.FlaywayApplication : No active profile set, falling back to default profiles: default
2022-11-02 09:54:22.684 INFO 11444 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8015 (http)
2022-11-02 09:54:22.694 INFO 11444 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2022-11-02 09:54:22.694 INFO 11444 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.56]
2022-11-02 09:54:22.781 INFO 11444 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2022-11-02 09:54:22.781 INFO 11444 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1124 ms
2022-11-02 09:54:23.171 INFO 11444 --- [ main] o.f.c.internal.license.VersionPrinter : Flyway Community Edition 6.5.7 by Redgate
2022-11-02 09:54:23.176 INFO 11444 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariCP - Starting...
2022-11-02 09:54:33.502 INFO 11444 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariCP - Start completed.
2022-11-02 09:54:33.519 INFO 11444 --- [ main] o.f.c.internal.database.DatabaseFactory : Database: jdbc:mysql://10.110.13.86:3306/flyway (MySQL 5.7)
2022-11-02 09:54:33.585 WARN 11444 --- [ main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Invocation of init method failed; nested exception is java.lang.reflect.InvocationTargetException
2022-11-02 09:54:33.585 INFO 11444 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariCP - Shutdown initiated...
2022-11-02 09:54:33.589 INFO 11444 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariCP - Shutdown completed.
2022-11-02 09:54:33.592 INFO 11444 --- [ main] o.apache.catalina.core.StandardService : Stopping service [Tomcat]
2022-11-02 09:54:33.602 INFO 11444 --- [ main] ConditionEvaluationReportLoggingListener :
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2022-11-02 09:54:33.632 ERROR 11444 --- [ main] o.s.boot.SpringApplication : Application run failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Invocation of init method failed; nested exception is java.lang.reflect.InvocationTargetException
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1804) ~[spring-beans-5.3.15.jar:5.3.15]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:620) ~[spring-beans-5.3.15.jar:5.3.15]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) ~[spring-beans-5.3.15.jar:5.3.15]
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.15.jar:5.3.15]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.15.jar:5.3.15]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.15.jar:5.3.15]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.15.jar:5.3.15]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:322) ~[spring-beans-5.3.15.jar:5.3.15]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.15.jar:5.3.15]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:953) ~[spring-beans-5.3.15.jar:5.3.15]
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918) ~[spring-context-5.3.15.jar:5.3.15]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) ~[spring-context-5.3.15.jar:5.3.15]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145) ~[spring-boot-2.6.3.jar:2.6.3]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:732) [spring-boot-2.6.3.jar:2.6.3]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:414) [spring-boot-2.6.3.jar:2.6.3]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:302) [spring-boot-2.6.3.jar:2.6.3]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303) [spring-boot-2.6.3.jar:2.6.3]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292) [spring-boot-2.6.3.jar:2.6.3]
at com.flyway.FlaywayApplication.main(FlaywayApplication.java:14) [classes/:na]
Caused by: java.lang.reflect.InvocationTargetException: null
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_71]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_71]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_71]
at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_71]
at org.springframework.boot.autoconfigure.flyway.FlywayMigrationInitializer.afterPropertiesSet(FlywayMigrationInitializer.java:70) ~[spring-boot-autoconfigure-2.6.3.jar:2.6.3]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1863) ~[spring-beans-5.3.15.jar:5.3.15]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1800) ~[spring-beans-5.3.15.jar:5.3.15]
... 18 common frames omitted
Caused by: org.flywaydb.core.api.FlywayException: Validate failed:
Detected resolved migration not applied to database: 20221103.10000
at org.flywaydb.core.Flyway.doValidate(Flyway.java:292) ~[flyway-core-6.5.7.jar:na]
at org.flywaydb.core.Flyway.access$100(Flyway.java:73) ~[flyway-core-6.5.7.jar:na]
at org.flywaydb.core.Flyway$1.execute(Flyway.java:166) ~[flyway-core-6.5.7.jar:na]
at org.flywaydb.core.Flyway$1.execute(Flyway.java:158) ~[flyway-core-6.5.7.jar:na]
at org.flywaydb.core.Flyway.execute(Flyway.java:527) ~[flyway-core-6.5.7.jar:na]
at org.flywaydb.core.Flyway.migrate(Flyway.java:158) ~[flyway-core-6.5.7.jar:na]
... 25 common frames omitted
Process finished with exit code 1错误原因:sql版本校验没过,正常情况一般是版本命名不规范,修改sql版本即可。
场景复现:我先创建个V20221103_10001add_flyway_test_table.sql的文件,执行版本迁移成功,然后我创建个V20221103_10000add_flyway_test_table.sql发下失败,明显是双下划线前面的版本不规范造成的。
该插件主要针对错误场景5
pom引入插件,切记插件中一定要标注
<user>、<password>、<driver>、 <url>、<locations>等属性,否则插件可能无生效。
<build>
<plugins>
<plugin>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-maven-plugin</artifactId>
<version>${flayway.test.version}</version>
<configuration>
<user>root</user>
<password>123456</password>
<driver>com.mysql.jdbc.Driver</driver>
<url>jdbc:mysql://10.110.13.86:3306/flyway?characterEncoding=utf8</url>
<baselineOnMigrate>true</baselineOnMigrate>
<!--sql脚本位置,flyway会自动去找到这个目录并且执行里面的sql脚本-->
<locations>classpath:db/migration/</locations>
</configuration>
</plugin>
</plugins>
</build>maven刷新后插件的位置

以上步骤中,每次想要migration都需要运行整个springboot项目,并且只能执行migrate一种命令,其实flyway还是有很多其它命令的。maven插件给了我们不需要启动项目就能执行flyway各种命令的机会。
插件命令说明:
其它命令的作用如下:
baseline
对已经存在数据库Schema结构的数据库一种解决方案。实现在非空数据库新建MetaData表,并把Migrations应用到该数据库;也可以在已有表结构的数据库中实现添加Metadata表。clean
清除掉对应数据库Schema中所有的对象,包括表结构,视图,存储过程等,clean操作在dev 和 test阶段很好用,但在生产环境务必禁用。info
用于打印所有的Migrations的详细和状态信息,也是通过MetaData和Migrations完成的,可以快速定位当前的数据库版本。repair
repair操作能够修复metaData表,该操作在metadata出现错误时很有用。undo
撤销操作,社区版不支持。validate
验证已经apply的Migrations是否有变更,默认开启的,原理是对比MetaData表与本地Migrations的checkNum值,如果值相同则验证通过,否则失败。migrate
注意:点击flyway:migrate和启动整个项目是不等价的,只点击flyway:migrate并没有执行迁移,而重新启动项目就会执行新的的迁移文件。
migrate是指把数据Schema迁移到最新版本,在Migrate时会检查MetaData元数据表,如果不存在就创建MetaData表,MetaData用于记录数据库历史变更等信息;
migrate会扫描指定文件系统或者classpath下的Migrations。会与MetaData中的记录进行对比,进行版本升级。这个撤销迁移脚本,也就是U开头的文件没玩明白,没查到完整的博客不明白如何使用,后续如果鼓弄明白了会补充进来的。如果有知道的博友也可以评论,一起学习实践下如何使用。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。