检测到已解决的迁移未应用于 flyway 上的数据库

Detected resolved migration not applied to database on flyway

我们正在使用 flyway 来管理数据库架构版本,但我们遇到了问题。由于我们作为一个团队工作并使用 git 作为我们的源代码管理,因此在某些情况下,不同的人会在他们自己的本地 repo 上更新数据库架构。如果发生这种情况,我们将得到

Detected resolved migration not applied to database: 2016.03.17.16.46"

时间“2016.03.17.16.46”是别人添加的,我已经应用了比那个时间晚的时间戳。如果发生这种情况,我们必须清理所有数据库表并重新创建它们。我们已尝试在 validateOnMigrate 上设置 false 并做了 flywayClean,但没有任何帮助。还有其他方法可以改变吗?

迁移选项 outOfOrder 是您的朋友。将其设置为 true 以允许在事后插入这些迁移。

在命令行中,运行:

flyway -outOfOrder=true migrate

或者如果您使用 Maven 插件:

mvn -Dflyway.outOfOrder=true flyway:migrate

我在从一个 git 分支切换到另一个分支并尝试 运行 时遇到了类似的问题 flyway:migrate。 例如,当我在分支 'release_4.6.0' 上时,我的本地计算机上没有从分支 'release_4.7.0' 迁移,所以 我收到下一个错误 FlywayException: Validate failed: Detected applied migration not resolved locally。 对我有用的解决方案是将 ignoreMissingMigrations flyway 选项设置为 true。 在 Maven 中它看起来像

flyway:migrate -Dflyway.ignoreMissingMigrations=true

也许这不是这个问题的答案,但它可以帮助那些遇到与我相同问题的人。

您可以在这里找到更多详细信息: https://flywaydb.org/documentation/configuration/parameters/ignoreMissingMigrations

只需添加 spring.flyway.ignore-missing-migrations=true 如果您使用 spring-boot.

到您的属性文件

这将忽略以前的迁移。

就我而言,我只是将我的迁移文件重命名为其他名称,然后再重命名回来——只是为了更新文件的修改日期。它奏效了。

如果您想在启动应用程序时应用迁移,也可以将其放入 application.properties 文件中:

spring.flyway.out-of-order=true

在我的例子中,数据库中存在版本为 319 的行,而 319 对应的文件已重命名为 do 330,因此数据库注册表找不到对应的文件。从数据库中删除行解决了问题。

outOfOrder 没有为我们解决问题。
两个迁移在一个部署中被删除之前。 因此,我们将这些迁移添加回去并撤消了另一个迁移中的更改。
工作