当前位置: 首页 > 知识库问答 >
问题:

如何处理以前有效的无效飞行路线迁移

江高飞
2023-03-14

我有一个Spring启动应用程序,它使用Flyway在Postgres中进行html" target="_blank">数据库迁移。

它现在大约有四年了,所以我们正在谈论Flyway 4.0.3,Spring Boot 1.3.x和Postgres 9.x。版本可能会升级,但我想在这样做之前修复任何现有的问题。

与此同时,Postgres升级到了高于9.x的版本。不幸的是,由于包含不推荐使用的语法,一些现有的迁移已经过时。因此,现在使用全新的数据库(即在开发环境中)启动应用程序会导致这些迁移失败。在生产中,这很好,因为那些迁移已经被应用了,不会再被应用了。

我很好奇这样做的最佳实践是什么。我不能只是去修复现有迁移中的语法,因为这会导致生产环境中的校验和失败。我知道维修是一回事,但是我不确定它是如何工作的,以及如何与Spring Boot一起使用。

失败的SQL:

UPDATE config
SET (description) = 'my description'
WHERE ...

正确的SQL:

UPDATE config
SET description = 'my description'
WHERE ...

错误:

Message    : ERROR: source for a multiple-column UPDATE item must be a sub-SELECT or ROW() expression

EDIT 24/04/2020 Spring Boot解决方案:

在 Grant Fitchey 在下面发布了有关如何对此进行修复的正确答案之后,我只想添加我如何专门使用Spring Boot执行此操作。我刚刚创建了一个飞途迁移策略的豆子,它在调用迁移之前调用修复

@Bean
public FlywayMigrationStrategy cleanMigrateStrategy() {
    return flyway -> {
        flyway.repair();
        flyway.migrate();
    };
}

在将其部署到生产环境时,在启动期间,Postgres中的<code>schema_versions</code>表中的校验和已修复。在另一个版本中,我将删除<code>飞道。修复()line,否则很明显,这将产生应用无效迁移的风险。

共有1个答案

燕玉堂
2023-03-14

您正在寻找修复选项。我不知道如何通过springboot直接调用它,但文档在这里。这应该能照顾到你想要的东西。

因此,在这种情况下,第一步是修复迁移,以便它们在开发环境中正确执行。开发现在应该没问题,飞行路线应该成功迁移。

在生产中,您现在应该会得到一个验证错误,因为校验和不同。快速通道修复将“修复”模式历史表,以便它html" target="_blank">存储的校验和与磁盘上的新校验和相匹配,因此快速通道验证再次通过。具体来说,flyway repair所做的是使模式历史表与您在磁盘上的内容相匹配。它将应用的迁移的所有校验和更新为您在磁盘上的校验和(因此,只有在您确信更改是相同的情况下才使用它)。它还从表中删除所有失败的迁移条目(同样,只有在您自己清理了数据库之后才使用它)。

 类似资料:
  • 我们在生产系统中使用Flyway进行数据库迁移。 最初它被开发为在MySQL 5.5上运行,后来我们的一些客户升级到5.6,然后升级到5.7。 与5.6相比,MySQL 5.7中有一个变化-定义为NOT NULL的datetime字段必须在SQL脚本中具有5.7的默认值,而在5.6中则允许没有默认值。 因此,我们在v11中有一个迁移做到了这一点,但在v2中有一个迁移使用了(现在在5.7中)非法语法

  • 目前,我们公司通过手动创建、分发和运行必要的SQL脚本来处理所有数据库模式更改。显然,这会导致各种机器偶尔更新和稀疏更新的问题。 我正在研究更现代的方法来解决这个问题,而Flyway现在是主要的候选人(尽管如果可以提出令人信服的论据,我们仍然愿意使用Liquibase)。 正常流程很简单,和宣传的一样简单,但是我们不知道如何正确处理冲突的迁移脚本。例如,不同个人分支(A和B)上的2名开发人员在不同

  • 我们使用Liquibase,现在在新项目中,我们必须使用Flyway。在liquibase中,迁移顺序在xml文件中,所以您可以指定什么是第一次迁移,什么是第二次迁移,它不依赖于名称。 所以,当一些开发人员添加新的迁移时,如果之前有人推动了新的迁移,那么他将在Git中遇到冲突,并且必须修复顺序。 这是如何在Flyway中实现的?如果并行添加迁移,如何控制顺序?

  • 在类路径中:/db。迁移有迁移但flyway没有看到这一点,而是爱上了msg 2022-05-02 17:28:07.993INFO 45296 --- [ restartedMain]c. c. c. ConfigServiceProperty tySourceLocator:从服务器获取配置,地址为:http://localhost:8888/story2022-05-02 17:28:08.

  • 我为命令行java迁移执行了以下步骤: < li >创建java文件 当我执行迁移逗号时,它会像 警告:无法解析位置类路径:db/迁移 请查看下面的附件图片,它实际上是罐子。我已经提取了更多信息。

  • 我们正在使用Flyway来迁移数据库模式,并且我们已经有了100多个迁移脚本。 一旦我们将多个迁移“压扁”为一个单一的第一版本迁移,在开发过程中,当我们删除并重新创建模式时,这就可以了。但在生产中,这是行不通的,因为Flyway无法验证迁移。 在这种情况下,我找不到任何文档或最佳实践。问题是文件数量不断增加,我不想每次都看到数千个迁移文件,本质上是如果生产已经在最新版本。我的意思是,那些版本号低于