Flyway 架构迁移失败

问题描述 投票:0回答:3
  • 我已成功使用新项目配置 Spring Boot 来工作 与飞路
  • 我使用 PostgreSQL 数据库从版本 0001.0 迁移到 0008.0
  • 我已在本地手动更改脚本,但 Flyway 迁移失败。

错误信息:

org.springframework.beans.factory.BeanCreationException:错误 创建类路径中定义的名为“flywayInitializer”的 bean 资源 [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: 调用init方法失败;嵌套异常是 org.flywaydb.core.api.FlywayException:验证失败:迁移 迁移版本 0006.0 的校验和不匹配

如何在不影响flyway_schema_history中的Flyway脚本的情况下更改数据库表?

例如,我需要使用alter命令更改表名,但执行Flyway迁移脚本没有失败。

注意:我不想从表 Flyway_schema_history 中删除脚本条目。

postgresql spring-boot flyway
3个回答
4
投票

有几种方法可以做到这一点:-

  1. 创建一个版本递增的新脚本文件。将用于更改此文件中的表的 DDL 命令放入其中。然后运行迁移。

  2. 如果您不想从 schema_version 表中删除条目,您可以更改该表中的校验和值。要计算校验和,请使用从

    org.flywaydb.core.internal.resolver.sql.SqlMigrationResolver
    复制的以下方法。您可以传递
    null
    作为资源参数:-

    /**
     * Calculates the checksum of this string.
     *
     * @param str The string to calculate the checksum for.
     * @return The crc-32 checksum of the bytes.
     */
    /* private -> for testing */
    static int calculateChecksum(Resource resource, String str) {
        final CRC32 crc32 = new CRC32();
    
        BufferedReader bufferedReader = new BufferedReader(new StringReader(str));
        try {
            String line;
            while ((line = bufferedReader.readLine()) != null) {
                crc32.update(line.getBytes("UTF-8"));
            }
        } catch (IOException e) {
            String message = "Unable to calculate checksum";
            if (resource != null) {
                message += " for " + resource.getLocation() + " (" + resource.getLocationOnDisk() + ")";
            }
            throw new FlywayException(message, e);
        }
    
        return (int) crc32.getValue();
    }
    
  3. 如果您使用的是 Flyway Pro 5+ 版本,您可以回滚迁移https://flywaydb.org/getstarted/undo

    这里的答案已经过时,但仍然可以帮助你。


2
投票

听起来您可能处于以下两种情况之一:

  1. 您想要重新运行版本化迁移。这并不是 Flyway 真正的工作原理,正如 Kartik 建议的那样,创建一个新的版本化迁移来更改表。
  2. 迁移文件已被修改,您希望保留该状态并运行新的文件(例如 0009.0)。遇到这种情况你可以尝试:
    1. 运行修复。这将重新计算校验和(除其他外)。
    2. 关闭 validateOnMigrate 选项,如果有修改的迁移文件,迁移不会失败。

0
投票

要在本地解决此错误而不删除整个数据库:

  1. 修复导致根本问题的迁移错误
  2. 断开数据库服务器的连接
  3. 打开自动创建的表“flyway_schema_history”
  4. 删除导致不匹配问题的版本的行
  5. 根据冲突迁移打开具有列的表并删除这些列(如果需要)
  6. 使用新的迁移再次运行您的数据库服务器
© www.soinside.com 2019 - 2024. All rights reserved.