Flyway报错源码分析——Validate failed: Migrations have failed validation
一、异常信息
今天早上启动项目,突然出现了如下异常,百度了一下没有合适的解决方案,决定从源码入手,看看能不能解决。
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 org.flywaydb.core.api.exception.FlywayValidateException: Validate failed: Migrations have failed validationat org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1786) ~[spring-beans-5.3.4.jar:5.3.4]at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:602) ~[spring-beans-5.3.4.jar:5.3.4]at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:524) ~[spring-beans-5.3.4.jar:5.3.4]at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.4.jar:5.3.4]at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.4.jar:5.3.4]at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.4.jar:5.3.4]at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.4.jar:5.3.4]at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:322) ~[spring-beans-5.3.4.jar:5.3.4]at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.4.jar:5.3.4]at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:944) ~[spring-beans-5.3.4.jar:5.3.4]at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:917) ~[spring-context-5.3.4.jar:5.3.4]at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:582) ~[spring-context-5.3.4.jar:5.3.4]at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:144) ~[spring-boot-2.4.3.jar:2.4.3]at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:767) ~[spring-boot-2.4.3.jar:2.4.3]at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759) ~[spring-boot-2.4.3.jar:2.4.3]at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:426) ~[spring-boot-2.4.3.jar:2.4.3]at org.springframework.boot.SpringApplication.run(SpringApplication.java:326) ~[spring-boot-2.4.3.jar:2.4.3]at org.springframework.boot.SpringApplication.run(SpringApplication.java:1311) ~[spring-boot-2.4.3.jar:2.4.3]at org.springframework.boot.SpringApplication.run(SpringApplication.java:1300) ~[spring-boot-2.4.3.jar:2.4.3]at com.zhx.realpro.CloudAlarmApplication.main(CloudAlarmApplication.java:33) ~[classes/:na]
Caused by: org.flywaydb.core.api.exception.FlywayValidateException: Validate failed: Migrations have failed validationat org.flywaydb.core.Flyway$1.execute(Flyway.java:172) ~[flyway-core-7.1.1.jar:na]at org.flywaydb.core.Flyway$1.execute(Flyway.java:164) ~[flyway-core-7.1.1.jar:na]at org.flywaydb.core.Flyway.execute(Flyway.java:538) ~[flyway-core-7.1.1.jar:na]at org.flywaydb.core.Flyway.migrate(Flyway.java:164) ~[flyway-core-7.1.1.jar:na]at org.springframework.boot.autoconfigure.flyway.FlywayMigrationInitializer.afterPropertiesSet(FlywayMigrationInitializer.java:66) ~[spring-boot-autoconfigure-2.4.3.jar:2.4.3]at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1845) ~[spring-beans-5.3.4.jar:5.3.4]at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1782) ~[spring-beans-5.3.4.jar:5.3.4]... 19 common frames omitted
二、异常分析
根据错误信息,报的是FlywayValidateException异常,找到这个类打上断点
启动项目,查看调用链
找到了抛出异常的位置,在它前面的这行打上断点启动项目,因为是这个结果判断之后才抛出异常
ValidateResult validateResult = doValidate(database, migrationResolver, schemaHistory, schemas, callbackExecutor, true);
跟进这行去看
ValidateResult validateResult = new DbValidate(database, schemaHistory, schemas, migrationResolver, configuration, ignorePending, callbackExecutor).validate();
validate方法里面,在Callable的call方法做校验,这块感觉有点过度设计了,没找到另起线程的好处。
migrationInfoService的refresh方法sql文件加载进来了,这块就不看了。接着往下进入List<ValidateOutput> invalidMigrations = migrationInfoService.validate();
验证所有sql文件的checksum,如果sql文件是第一次执行,会产生一个checksum。之后改了sql文件的内容checksum的值就会发生改变,从而验证失败validateError就不会为空,那么invalidMigrations就会添加一条。进入migrationInfo.validate();
走到这块发现两个checksum不一致。跟进去resolvedMigration.checksumMatches
不一致就返回false
返回一个ErrorDetails,错误信息很详细,不过最终却没有输出,看看怎么回事,返回到DbValidate.DbValidate方法,call执行之后返回了result。
目前为止result里面还是有详细的错误信息的
校验失败的sql文件不为空就进入 validationError = new ErrorDetails(ErrorCode.VALIDATE_ERROR, "Migrations have failed validation");
,这里的异常信息写死成“Migrations have failed validation”,导致更加详细的错误信息没有输出,记得老版本的flyway是有输出的。这样改了反而不直观。返回到Flyway.migrate
校验失败,抛出异常信息“ Migrations have failed validation”。
三、解决方案
前面已经讲到一般是由于sql文件在第一次执行之后发生了改变导致的。
- 方案一:不要改动sql文件,增加新的sql文件去修改表
- 方案二:直接将数据库表flyway_schema_history中的checksum改成新生成的checksum,但是不建议直接改库。估计也是这个原因,新版的flyway就不把新产生的checksum打印出来了
Flyway报错源码分析——Validate failed: Migrations have failed validation相关推荐
- axi dma 常见的中断报错源码
// axi dma 中断判断 常见错误;这个对于排查错误很有帮助if (status & XILINX_DMA_DMASR_ERR_IRQ) { /** An error occurred. ...
- 【报错】flink源码分析: has no more allocated slots与思考
文章目录 一. 任务描述与一句话 1. 任务描述 2. 一句话 二. 日志分析 1. 申请一个task manager 2. 大概3分钟后运行这个tm时,报资源找不到 三. 源码分析与报错机制定位 1 ...
- 微信支付生成签名和验签SDK源码分析
目录 一.签名分析 1.1 流程分析 1.构造签名串 2.计算签名值 3.设置请求头 二.源码级别分析 二.获取平台证书分析 三.验签分析 3.1 验签使用场景: 3.2 验证流程: 1.获取微信平台 ...
- PPP协议工作流程,结合ppp-2.4.9 源码分析
ppp-2.4.9 源码分析 文章目录 ppp-2.4.9 源码分析 PPP协议工作流程 ppp-2.4.9 源码分析 全局变量和结构体说明 第一阶段 初始化 第二阶段 开始链接 第三阶段 建立PPP ...
- 【spring源码】源码分析
[spring源码]源码分析 (一)mac版idea引入spring源码 (二)spring的学习流程 (三)spring源码分析 [1]refresh()方法概览(AbstractApplicati ...
- Hhadoop-2.7.0中HDFS写文件源码分析(二):客户端实现(1)
一.综述 HDFS写文件是整个Hadoop中最为复杂的流程之一,它涉及到HDFS中NameNode.DataNode.DFSClient等众多角色的分工与合作. 首先上一段代码,客户端是如何写文件的: ...
- kazoo源码分析:服务器交互的实现细节
kazoo源码分析 kazoo-2.6.1 kazoo客户端与服务器概述 上文start概述中,只是简单的概述了kazoo客户端初始化之后,调用了start方法,本文继续详细的了解相关的细节. kaz ...
- kazoo源码分析:Zookeeper客户端start概述
kazoo源码分析 kazoo-2.6.1 kazoo客户端 kazoo是一个由Python编写的zookeeper客户端,实现了zookeeper协议,从而提供了Python与zookeeper服务 ...
- Nginx源码分析:master/worker工作流程概述
nginx源码分析 nginx-1.11.1 参考书籍<深入理解nginx模块开发与架构解析> Nginx的master与worker工作模式 在生成环境中的Nginx启动模式基本都是以m ...
最新文章
- 使用多尺度空间注意力的语义分割方法
- linux grep 点号的匹配
- dubbo控制中心部署,权重配置,以及管控台中各个配置的简单查看
- write up社工进阶
- php excel 下拉菜单,使用 PHPExcel 遇到的一个问题:下拉列表的数据来源过长时,显示了别的正常的下拉列表的数据来源...
- 发布的站点自定义端口打不开解决方法
- geohash java 距离排序_APP筛选附近的人并排序(geohash算法)
- 全国计算机等级考试三级数据库技术考试大纲(2018 年版)
- python3视频教程哪个好_2020年5个经典python编程入门视频教程推荐学习
- python调用crt自动登录_secureCRT自动登录脚本(python)
- android/ios播放器ijkplayer Ubuntu编译(支持HTTPS、ffmpeg高版本)
- java 实现短信验证码
- Ir_scheduler模块
- 怎么压缩word文档大小?
- 微信支付(小程序微信支付)
- 扫雷代码java_JAVA实现扫雷游戏
- Matlab abs防抱死系统,防抱死制动系统建模
- 综述 | 图像计算传感器
- c语言程序的上标怎么打出来,c上标2下标5怎么算
- Altium Designer:从零开始的电路板制作攻略
热门文章
- 谷歌通过Chrome简化登录安卓密码支持
- centos7+TP5.1+selenium+chrome抓取搜狗微信推文
- AI核心代码,保守估值一个亿(python版)
- burnintest linux,BURNINTEST-FOR-LINUX-CLI
- 微波炉定时c语言程序,微波炉定时器—微波炉定时器与微波炉原理
- java创建QRCode二维码的三种方式
- 斯坦李去世、霍金去世、金庸去世、李咏去世,2018年有点悲壮!
- javafx制作2.5d的rpg游戏
- 树莓派(网络摄像头)4G网络720p高清图传(python3.7+SpringBoot-JavaNetty+Android-Mediacodec)
- Cisco认证考试教材题库合集(30套)