spring boot的flyway迁移错误详细信息

q0qdq0h2  于 2021-07-22  发布在  Java
关注(0)|答案(3)|浏览(1598)

我们有一个项目使用Spring Boot和飞道。
当我们运行失败的迁移时,日志级别都设置为debug,我们只得到以下消息:

[DEBUG] org.flywaydb.core.internal.command.DbValidate - Validating migrations ...
[DEBUG] org.flywaydb.core.internal.scanner.Scanner - Filtering out resource: db/migration/V1/V1_202103081030__account.sql (filename: V1_202103081030__account.sql)
[DEBUG] org.flywaydb.core.internal.scanner.Scanner - Filtering out resource: db/migration/V1/V1_202103081040__place.sql (filename: V1_202103081040__place.sql)
[DEBUG] org.flywaydb.core.internal.scanner.Scanner - Filtering out resource: db/migration/V1/V1_202103151608__document.sql (filename: V1_202103151608__document.sql)
[DEBUG] org.flywaydb.core.Flyway - Memory usage: 147 of 254M
[ERROR] org.springframework.boot.web.embedded.tomcat.TomcatStarter - Error starting Tomcat context. Exception: org.springframework.beans.factory.UnsatisfiedDependencyException. Message: Error creating bean with name 'webSecurityConfig': Unsatisfied dependency expressed through method 'setContentNegotationStrategy' parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration$EnableWebMvcConfiguration': Unsatisfied dependency expressed through method 'setConfigurers' parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'openEntityManagerInViewInterceptorConfigurer' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/JpaBaseConfiguration$JpaWebConfiguration.class]: Unsatisfied dependency expressed through method 'openEntityManagerInViewInterceptorConfigurer' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'openEntityManagerInViewInterceptor' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/JpaBaseConfiguration$JpaWebConfiguration.class]: Initialization of bean failed; nested exception is 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 validation
...
[INFO ] org.apache.catalina.core.StandardService - Stopping service [Tomcat]
...
Caused by: org.flywaydb.core.api.exception.FlywayValidateException: Validate failed: Migrations have failed validation

没有关于失败原因的更多详细信息(失败的查询、不匹配的校验和…)。
我看着 spring.flyway 但在这里找不到任何有用的东西。
我们应该如何在服务器启动时在日志中显示flyway root错误?
编辑:要明确的是,问题不是失败本身(在flyway类中设置断点可以揭示源错误)。问题是日志中缺少错误详细信息。

30byixjq

30byixjq1#

我也遇到了同样的问题,发现它与我使用的flyway版本(springboot2.4.3,使用flyway7.1.1)有关。这是一个已知的问题2987-在异常中显示所有验证消息,在Flyway7.2.0中修复。
他们建议跑步 flyway validate -outputType=json 作为获取详细错误消息的解决方法。我试过了,但还是没有得到详细的错误信息。
我的解决方案是通过在pom文件中指定版本升级到flyway 7.2.0:

<dependency>
    <groupId>org.flywaydb</groupId>
    <artifactId>flyway-core</artifactId>
    <version>7.2.0</version>
</dependency>
bxjv4tth

bxjv4tth2#

我不知道具体是什么失败了,但这可能会帮助你指出正确的方向。
打开dbvalidate(flyway类)(如果需要,请下载源代码)
在第186-187行的else语句中放置一个断点
重新启动服务器
这至少会告诉你哪个文件失败了。
然后,您可以向flyway项目发出增强请求,以便更好地报告错误。

dfuffjeb

dfuffjeb3#

嗯,很多事情都可能发生,但一个可能的原因是,在应用迁移文件之后,您已经更改了它。我将通过用例来解释:
假设在时间x有两个迁移(技术上是在sql文件中实现的):a1和a2。
这是您使用a1和a2进行的第一次提交,当您运行应用程序时,flyway会在数据库中创建一个特殊的表,以查看已经应用了哪些迁移。显然,在时间x还没有迁移,所以它创建一个表,应用a1和a2,并在表中添加2条记录。这些记录应该包括一个校验和。简单地说,您可以将这些校验和看作a1和a2内容的散列(如sha1)。
到目前为止还不错,现在当您引入一个新的迁移文件a3时,可以在时间上快速前进(到时间y)。
当您重新部署应用程序时,flyway会检查已经应用的a1和a2是否没有更改,并且只有在更改之后才会应用新的迁移。
现在,这个验证实际上是应用迁移a3检查这些哈希-校验和的先决条件。这是合理的—因为如果您碰巧更改了a1或a2—flyway应该怎么做—它如何保证迁移按预期工作?
你也可以在官方的flyway文档中阅读关于这个验证的内容,但是,你得到了我相信的想法。有人通过更改一个现有迁移更改了校验和,并试图重新部署应用程序。
简单地说,一旦应用了迁移文件,就不能在源代码树中更改它
现在我描述的场景是一种可能的场景,一般来说,您甚至不必创建迁移a3,只需更改现有的迁移并尝试重新运行应用程序,验证就会失败。

相关问题