写点什么

springboot 使用 flyway,使用介绍、个人总结及报错场景如何修改

作者:刘大猫
  • 2025-10-30
    黑龙江
  • 本文字数:33834 字

    阅读完需:约 111 分钟

@[toc]

一、背景

  • 我的springboot版本为2.7.5

  • Flyway是一个款数据库版本管理工具,它可以很方便的在命令行中使用,或者在 Java 应用程序中引入,用于管理我们的数据库版本。

  • 通过集成Flyway可以实现启动项目时自动执行项目迭代升级所需 Sql 语句,从而减少升级项目时人工干预成本。

  • Flyway最核心的就是用于记录所有版本演化和状态的 MetaData 表,Flyway 首次启动会创建默认名为 SCHEMA_VERSION 的元素局表。 表中保存了版本,描述,要执行的 sql 脚本等。


MetaData 表就是元数据表,就是flyway_schema_history




  • 在项目或产品中,很难一开始就把业务理清楚,把数据库表设计好,因此数据表也会在迭代周期不断迭代。在 Java 应用程序中使用 Flyway,能快速有效地用于迭代数据库表结构,并保证部署到测试环境或生产环境时,数据表都是保持一致的。


flyway官方文档:https://flywaydb.org/documentation/

二、为什么要使用 flyway

在多人开发的项目中,我们都习惯了使用 SVN 或者 Git 来对代码做版本控制,主要的目的就是为了解决多人开发代码冲突和版本回退的问题。


其实,数据库的变更也需要版本控制,在日常开发中,我们经常会遇到下面的问题:1. 自己写的 SQL 忘了在所有环境执行。2. 别人写的 SQL 我们不能确定是否都在所有环境执行过了。3. 有人修改了已经执行过的 SQL,期望再次执行。4. 需要新增环境做数据迁移。5. 每次发版需要手动控制先发 DB 版本,再发布应用版本。6. 其它场景。


有了 flyway,这些问题都能得到很好的解决。

三、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



  • Eg:

  • 版本升级: V1_2_0__upgrade.sql(不推荐,因为小版本改动“1_2_0”这个数值不好一直叠加)

  • BUG 修复: V1_2_0_20220816__hotfix.sql

  • V20221104_10001.sql推荐这种命名方式,其中 20221102 代表日期,10001 代表 SVN 或者 Git 的提交版本号,便于迭代)

  • V20221104_10001__add.sql也推荐使用这种,双下划线后面加点描述词)

  • 规则说明:

  • 前缀分隔符

  • V: 版本化迁移 (使用)

  • 默认 V 开头 (可配置)

  • V(大些),小些不执行

  • R: 可重复迁移 (不使用)

  • 新增或追加脚本时再次执行该文件所有脚本(包括历史 sql)

  • 历史 sql 脚本不可更改

  • 不需要指定脚步版本

  • U: 撤销迁移 (不使用)

  • 编写各版本对应撤销版本脚步

  • 需要通过 Flyway 客户端执行撤销命令,执行最近一次版本撤销

  • 撤销场景较复杂,建议版本升级前进行 DB 备份,实现撤销

  • SQL 脚本版本

  • 2_1 为 sql 版本号, ‘_’ 翻译为小数点,即为 2.1 版本

  • 新建脚本,版本只可递增

  • 不可使用 V1 作为版本号

  • 分隔符

  • ‘__’ 双下划线 (可配置)

  • SQL 脚本名描述(待定)

  • 多个单词用下划线或空格将单词分开

  • 版本化升级: upgrade

  • BUG 修复: hotfix

  • .sql 为固定后缀

五、Flyway 的迁移类型

版本迁移:以V开头的文件


最常见的迁移就是就是版本化迁移,每次迁移都会对应的迁移版本,迁移的版本必须全局唯一,版本迁移最大的特点就是依次只被执行依次。


撤销迁移:以U开头的文件(这个U开头的撤销文件我没玩明白如何使用,后续研究明白了再补上)


每个撤销迁移都对应的一个版本迁移,也就是说撤销迁移是针对版本迁移所存在的,每一个撤销迁移与版本迁移都是一一对应的,而且对应的版本号必须一致。


可重复迁移:以R开头的文件


可重复迁移有描述和校验码,但是没有版本号,程序在每次启动的时候,如果发现脚本文件有变化就会执行。


基于 SQL 的迁移


上面提到的几种类型都是基于 SQL 文件来执行的,只不过每种类型的命名格式不一样,下图是从官网上截下来的,大家看下每种类型的文件应该按照如下的格式去命令,其中的 Separator 是两个下划线。



主要分为下面几个部分:


prefix:前缀,不同的类型采用不同的前缀,版本迁移使用 V,撤销迁移使用 U,可重复迁移使用 R,当然这些都是可配置的;


Version:版本号,可以使用点符号或者单下划线链接;


Separator:分隔符,两个下划线,也是可以配置的;


Description:版本描述可以用下划线和空格分隔;


Suffix:后缀,一般都是 .sql

六、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;

八、SpringBoot 项目使用 Flyway 步骤

项目目录

第 1 步:引入 pom

第 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>
复制代码

第 2 步:配置文件 application.yml

# 端口号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 #用于记录所有的版本变化记录
复制代码

第 3 步:编写 sql 迁移脚本文件

就是写了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';
复制代码

第 4 步:创建启动类 FlaywayApplication

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 **/@SpringBootApplicationpublic 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: default2022-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 WebApplicationContext2022-11-01 13:34:03.005 INFO 21004 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1086 ms2022-11-01 13:34:03.400 INFO 21004 --- [ main] o.f.c.internal.license.VersionPrinter : Flyway Community Edition 6.5.7 by Redgate2022-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 table2022-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 table2022-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 -1
复制代码


flyway 库下的表结构



flyway_schema_history



flyway_test_table


十、flyway 拓展知识

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的valueflyway.schemas设定需要flywary迁移的schema,大小写敏感,默认为连接默认的schema.flyway.sql-migration-prefix迁移文件的前缀,默认为V.flyway.sql-migration-separator迁移脚本的文件名分隔符,默认__flyway.sql-migration-suffix迁移脚本的后缀,默认为.sqlflyway.tableflyway使用的元数据表名,默认为schema_versionflyway.target迁移时使用的目标版本,默认为latest versionflyway.url迁移时使用的JDBC URL,如果没有指定的话,将使用配置的主数据源flyway.user迁移数据库的用户名flyway.validate-on-migrate迁移时是否校验,默认为true.
复制代码

十一、练习使用 flyway 碰到的错误场景及解决方案

错误场景 1:Correct the classpath of your application so that it contains compatible versions of the classes org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration$FlywayConfiguration and org.flywaydb.core.api.configuration.FluentConfiguration

详情错误日志


  .   ____          _            __ _ _ /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/  ___)| |_)| | | | | || (_| |  ) ) ) )  '  |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot ::                (v2.6.3)
2022-11-01 10:52:01.616 INFO 26424 --- [ main] com.flyway.FlaywayApplication : Starting FlaywayApplication using Java 11.0.12 on HYT211145187-01 with PID 26424 (G:\WorkSpace\springboot-test\flyway-test\target\classes started by 211145187 in G:\WorkSpace\springboot-test)2022-11-01 10:52:01.619 INFO 26424 --- [ main] com.flyway.FlaywayApplication : No active profile set, falling back to default profiles: default2022-11-01 10:52:02.677 INFO 26424 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8015 (http)2022-11-01 10:52:02.691 INFO 26424 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]2022-11-01 10:52:02.691 INFO 26424 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.56]2022-11-01 10:52:02.778 INFO 26424 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext2022-11-01 10:52:02.779 INFO 26424 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1070 ms2022-11-01 10:52:03.148 WARN 26424 --- [ 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.NoSuchMethodError: org.flywaydb.core.api.configuration.FluentConfiguration.ignoreMissingMigrations(Z)Lorg/flywaydb/core/api/configuration/FluentConfiguration;2022-11-01 10:52:03.151 INFO 26424 --- [ main] o.apache.catalina.core.StandardService : Stopping service [Tomcat]2022-11-01 10:52:03.161 INFO 26424 --- [ main] ConditionEvaluationReportLoggingListener :
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.2022-11-01 10:52:03.177 ERROR 26424 --- [ main] o.s.b.d.LoggingFailureAnalysisReporter :
***************************APPLICATION FAILED TO START***************************
Description:
An attempt was made to call a method that does not exist. The attempt was made from the following location:
org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration$FlywayConfiguration.configureIgnoredMigrations(FlywayAutoConfiguration.java:273)
The following method did not exist:
org.flywaydb.core.api.configuration.FluentConfiguration.ignoreMissingMigrations(Z)Lorg/flywaydb/core/api/configuration/FluentConfiguration;
The calling method's class, org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration$FlywayConfiguration, was loaded from the following location:
jar:file:/F:/apache-maven-3.6.3/repository/org/springframework/boot/spring-boot-autoconfigure/2.6.3/spring-boot-autoconfigure-2.6.3.jar!/org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class
The called method's class, org.flywaydb.core.api.configuration.FluentConfiguration, is available from the following locations:
jar:file:/F:/apache-maven-3.6.3/repository/org/flywaydb/flyway-core/9.6.0/flyway-core-9.6.0.jar!/org/flywaydb/core/api/configuration/FluentConfiguration.class
The called method's class hierarchy was loaded from the following locations:
org.flywaydb.core.api.configuration.FluentConfiguration: file:/F:/apache-maven-3.6.3/repository/org/flywaydb/flyway-core/9.6.0/flyway-core-9.6.0.jar

Action:
Correct the classpath of your application so that it contains compatible versions of the classes org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration$FlywayConfiguration and org.flywaydb.core.api.configuration.FluentConfiguration
复制代码


错误原因:pom 中 flyway-core 的依赖版本问题,当设置 9.6.0 时就报这个错误,但当设置 6.5.7 时就能正常启动,感觉是 flyway 高版本和 springboot2.x 版本不匹配的问题导致的问题,具体为啥目前不清楚,只要把 flyway 版本设置成 5.2.1 或者 6.5.7 版本以及之间的版本那都是可以运行的。

错误场景 2:SLF4J: No SLF4J providers were found.或者 SLF4J: Defaulting to no-operation (NOP) logger implementation

详情错误日志


SLF4J: No SLF4J providers were found.SLF4J: Defaulting to no-operation (NOP) logger implementationSLF4J: See https://www.slf4j.org/codes.html#noProviders for further details.SLF4J: Class path contains SLF4J bindings targeting slf4j-api versions 1.7.x or earlier.SLF4J: Ignoring binding found at [jar:file:/F:/apache-maven-3.6.3/repository/ch/qos/logback/logback-classic/1.2.10/logback-classic-1.2.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]SLF4J: See https://www.slf4j.org/codes.html#ignoredBindings for an explanation.
. ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.6.3)
复制代码


报错原因:pom 中没有 slf4j 的相关框架实现,即现在项目只有框架门面,而缺少具体的框架实现。


解决方案:pom 中添加如下 2 个依赖即可解决问题。


<dependency>  <groupId>org.slf4j</groupId>  <artifactId>slf4j-api</artifactId>  <version>1.7.33</version></dependency><dependency>  <groupId>org.slf4j</groupId>  <artifactId>slf4j-log4j12</artifactId>  <version>1.7.33</version></dependency>
复制代码


可参考如下其他人博客:↓


SLF4J 报错解决:No SLF4J providers were found

错误场景 3:java.sql.SQLSyntaxErrorException: Unknown database 'flyway'

详情错误日志


  .   ____          _            __ _ _ /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/  ___)| |_)| | | | | || (_| |  ) ) ) )  '  |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot ::                (v2.6.3)
2022-11-01 13:34:54.569 INFO 7488 --- [ main] com.flyway.FlaywayApplication : Starting FlaywayApplication using Java 1.8.0_71 on HYT211145187-01 with PID 7488 (G:\WorkSpace\springboot-test\flyway-test\target\classes started by 211145187 in G:\WorkSpace\springboot-test)2022-11-01 13:34:54.572 INFO 7488 --- [ main] com.flyway.FlaywayApplication : No active profile set, falling back to default profiles: default2022-11-01 13:34:55.624 INFO 7488 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8015 (http)2022-11-01 13:34:55.634 INFO 7488 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]2022-11-01 13:34:55.634 INFO 7488 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.56]2022-11-01 13:34:55.730 INFO 7488 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext2022-11-01 13:34:55.730 INFO 7488 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1111 ms2022-11-01 13:34:56.117 INFO 7488 --- [ main] o.f.c.internal.license.VersionPrinter : Flyway Community Edition 6.5.7 by Redgate2022-11-01 13:34:56.122 INFO 7488 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariCP - Starting...2022-11-01 13:35:07.441 ERROR 7488 --- [ main] com.zaxxer.hikari.pool.HikariPool : HikariCP - Exception during pool initialization.
java.sql.SQLSyntaxErrorException: Unknown database 'flyway' at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120) ~[mysql-connector-j-8.0.31.jar:8.0.31] at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) ~[mysql-connector-j-8.0.31.jar:8.0.31] at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:828) ~[mysql-connector-j-8.0.31.jar:8.0.31] at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:448) ~[mysql-connector-j-8.0.31.jar:8.0.31] at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:241) ~[mysql-connector-j-8.0.31.jar:8.0.31] at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:198) ~[mysql-connector-j-8.0.31.jar:8.0.31] at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) ~[HikariCP-4.0.3.jar:na] at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:364) ~[HikariCP-4.0.3.jar:na] at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:206) ~[HikariCP-4.0.3.jar:na] at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:476) [HikariCP-4.0.3.jar:na] at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) [HikariCP-4.0.3.jar:na] at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:115) [HikariCP-4.0.3.jar:na] at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) [HikariCP-4.0.3.jar:na] at org.flywaydb.core.internal.jdbc.JdbcUtils.openConnection(JdbcUtils.java:56) [flyway-core-6.5.7.jar:na] at org.flywaydb.core.internal.jdbc.JdbcConnectionFactory.<init>(JdbcConnectionFactory.java:80) [flyway-core-6.5.7.jar:na] at org.flywaydb.core.Flyway.execute(Flyway.java:453) [flyway-core-6.5.7.jar:na] at org.flywaydb.core.Flyway.migrate(Flyway.java:158) [flyway-core-6.5.7.jar:na] 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] 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]
复制代码


错误原因:mysql 数据库下没有叫 flyway 的数据库。


解决方案:必须先创建名为 flyway 的数据库后,才能设置 url: jdbc:mysql://10.110.13.86:3306/flyway?characterEncoding=utf8。

错误场景 4:Caused by: org.flywaydb.core.api.FlywayException: Validate failed: Detected failed migration to version 1.0 (create flyway test table)

详情错误日志


  .   ____          _            __ _ _ /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/  ___)| |_)| | | | | || (_| |  ) ) ) )  '  |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot ::                (v2.6.3)
2022-11-01 13:56:26.099 INFO 25648 --- [ main] com.flyway.FlaywayApplication : Starting FlaywayApplication using Java 1.8.0_71 on HYT211145187-01 with PID 25648 (G:\WorkSpace\springboot-test\flyway-test\target\classes started by 211145187 in G:\WorkSpace\springboot-test)2022-11-01 13:56:26.102 INFO 25648 --- [ main] com.flyway.FlaywayApplication : No active profile set, falling back to default profiles: default2022-11-01 13:56:27.276 INFO 25648 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8015 (http)2022-11-01 13:56:27.312 INFO 25648 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]2022-11-01 13:56:27.312 INFO 25648 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.56]2022-11-01 13:56:27.401 INFO 25648 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext2022-11-01 13:56:27.401 INFO 25648 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1249 ms2022-11-01 13:56:27.778 INFO 25648 --- [ main] o.f.c.internal.license.VersionPrinter : Flyway Community Edition 6.5.7 by Redgate2022-11-01 13:56:27.784 INFO 25648 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariCP - Starting...2022-11-01 13:56:38.112 INFO 25648 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariCP - Start completed.2022-11-01 13:56:38.130 INFO 25648 --- [ main] o.f.c.internal.database.DatabaseFactory : Database: jdbc:mysql://10.110.13.86:3306/flyway (MySQL 5.7)2022-11-01 13:56:38.193 WARN 25648 --- [ 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.InvocationTargetException2022-11-01 13:56:38.193 INFO 25648 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariCP - Shutdown initiated...2022-11-01 13:56:38.197 INFO 25648 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariCP - Shutdown completed.2022-11-01 13:56:38.200 INFO 25648 --- [ main] o.apache.catalina.core.StandardService : Stopping service [Tomcat]2022-11-01 13:56:38.209 INFO 25648 --- [ main] ConditionEvaluationReportLoggingListener :
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.2022-11-01 13:56:38.238 ERROR 25648 --- [ 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 omittedCaused by: org.flywaydb.core.api.FlywayException: Validate failed: Detected failed migration to version 1.0 (create flyway test table)
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
复制代码


错误原因:数据库涉及的 2 张表没全删掉(可能有一个表还存在情况下启动的项目),如图,我这边模拟的场景是第一次启动项目,实现第一个 sql 创建 DDL 的创建表语句,第二个 sql 插入一条数据的场景,但是我涉及的的 2 个表 flyway_schema_history 和 flyway_test_table 没删掉。



解决方案:这两个表都删除情况下再重新启动项目

错误场景 5:Migration checksum mismatch for migration version 1.1 -> Applied to database : 1332862643 -> Resolved locally : -826751737

详情错误日志


  .   ____          _            __ _ _ /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/  ___)| |_)| | | | | || (_| |  ) ) ) )  '  |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: 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: default2022-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 WebApplicationContext2022-11-01 14:50:34.460 INFO 26596 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1052 ms2022-11-01 14:50:34.839 INFO 26596 --- [ main] o.f.c.internal.license.VersionPrinter : Flyway Community Edition 6.5.7 by Redgate2022-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.InvocationTargetException2022-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 omittedCaused 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.1__add_flyway_test_table.sql,里面有个 insert 插入一条数据的 sql,然后我启动整个项目,执行 sql 插入一条数据,且 V 开头的文件按常理已经执行过一次了,后面压根不会再次执行,但我手欠儿,再次对 V 开头的文件 V1.1__add_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.1__add_flyway_test_table.sql 里面有个内容,然后我对它修改后,执行 flyway:repair,在执行 flyway:migrate 后,再次启动项目发现 V1.1__add_flyway_test_table.sql 新增的内容没有执行?数据库没有产生新数据?


答案:应该是不会执行的,除非新增个 V 开头的迁移文件才会执行,即:对已经执行过的 V 开头的迁移文件修改后也不会执行,需要新建迁移文件进行修改才会生效。

错误场景 6:Caused by: java.lang.NoSuchMethodError: org.flywaydb.core.api.configuration.FluentConfiguration.ignoreMissingMigrations(Z)Lorg/flywaydb/core/api/configuration/FluentConfiguration;

详情错误日志


  .   ____          _            __ _ _ /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/  ___)| |_)| | | | | || (_| |  ) ) ) )  '  |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: 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: default2022-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 WebApplicationContext2022-11-01 16:38:18.215 INFO 18260 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1101 ms2022-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 omittedCaused 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 omittedCaused 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 版本以及之间的版本那都是可以运行的。

错误场景 7:Detected resolved migration not applied to database: 20221103.10000

详情错误日志


  .   ____          _            __ _ _ /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/  ___)| |_)| | | | | || (_| |  ) ) ) )  '  |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: 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: default2022-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 WebApplicationContext2022-11-02 09:54:22.781 INFO 11444 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1124 ms2022-11-02 09:54:23.171 INFO 11444 --- [ main] o.f.c.internal.license.VersionPrinter : Flyway Community Edition 6.5.7 by Redgate2022-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.InvocationTargetException2022-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 omittedCaused 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_10001__add_flyway_test_table.sql 的文件,执行版本迁移成功,然后我创建个 V20221103_10000__add_flyway_test_table.sql 发下失败,明显是双下划线前面的版本不规范造成的。

十二、flyway-maven-plugin 使用介绍

该插件主要针对错误场景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 完成的,可以快速定位当前的数据库版本。

  • repairrepair 操作能够修复 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 开头的文件没玩明白,没查到完整的博客不明白如何使用,后续如果鼓弄明白了会补充进来的。如果有知道的博友也可以评论,一起学习实践下如何使用。

用户头像

刘大猫

关注

还未添加个人签名 2022-08-23 加入

还未添加个人简介

评论

发布
暂无评论
springboot使用flyway,使用介绍、个人总结及报错场景如何修改_环境工程_刘大猫_InfoQ写作社区