【问题标题】:Retry a flyway failed migration重试flyway失败的迁移
【发布时间】:2012-08-09 01:31:04
【问题描述】:

我只是在配置和完全理解flyway的过程中,我遇到了这种情况:

  • 我成功配置了一个新项目以使用 flyway。
  • 我成功地将测试数据库从版本 0 迁移到 1.0.3。
  • 迁移到版本 1.0.4 未能执行。 (我试图添加已经存在的列,到目前为止没有问题,我的错。)

但是,一旦我对相应的脚本进行了必要的更改以使其正常工作,flyway 一直显示此消息:

 Current schema version: 1.0.4
 com.googlecode.flyway.core.migration.MigrationException: Migration to version 1.0.4 failed! Please restore backups and roll back database and code!

由于我不想恢复完整的转储并再次应用每个迁移,只是为了使更改表脚本正常工作,所以我最终对“schema_version”表进行了一些更改:

  • 第一次我删除了版本 1.0.4 的条目
  • 第二次我将版本 1.0.3 的 'current_version' 字段设置为 1
  • 然后再次执行 flyway:migrate 命令

在此之后,最终应用了迁移并显示了成功消息,但是我不太确定这是否是处理这种情况的正确方法。我不确定自己是否有权修改“schema_version”表,因为我认为它只能由 flyway 本身修改。

所以,在解释了发生在我身上的事情之后,我的问题是:

有没有办法“重试”在 flyway 中应用失败的迁移,而无需自己修改“schema_version”表?

任何我不知道的命令来完成这个任务?

【问题讨论】:

    标签: flyway


    【解决方案1】:

    常见问题解答中对此进行了回答:http://flywaydb.org/documentation/faq.html#repair

    即将推出的 Flyway 2.0 将包含修复命令。此代码已签入 SCM。

    注意:这只处理 Flyway 的元数据表。您仍然有责任清除迁移失败造成的任何其他影响。

    更新: Flyway 2.0 现已发布。您可以通过http://flywaydb.org获取它

    【讨论】:

    • 什么是“您仍然有责任清除迁移失败的任何其他影响。”方法?我的意思是我必须采取哪些步骤来清理失败的表创建迁移。
    • 这取决于迁移脚本的作用。就像它丢了东西一样,它不会再成功地丢掉它!
    • 即运行flyway repair
    【解决方案2】:

    我不知道这是否是个好主意,但是如果 migrate() 失败,您可以尝试进行 repair():

    final Flyway flyway = new Flyway();
    flyway.setBaselineOnMigrate(true);
    flyway.setValidateOnMigrate(false);
    flyway.setDataSource(dataSource());
    try {
        flyway.migrate();
    } catch (final Exception e) {
        logger.error("Flyway migration failed, doing a repair and retrying ...");
        flyway.repair();
        flyway.migrate();
    }
    

    【讨论】:

      【解决方案3】:

      完整示例,这将始终在运行迁移之前尝试修复,其余配置在配置文件中。

      @Configuration
      public class PersistanceConfiguration {
          protected final Logger log = LoggerFactory.getLogger(this.getClass());
      
          @Bean
          public FlywayMigrationStrategy cleanMigrateStrategy() {
              FlywayMigrationStrategy strategy = new FlywayMigrationStrategy() {
                  @Override
                  public void migrate(Flyway flyway) {
                      flyway.repair();
                      flyway.migrate();
                  }
              };
              return strategy;
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 2019-01-16
        • 2014-08-02
        • 2020-05-24
        • 2020-02-25
        • 2012-07-21
        • 2017-12-11
        • 2019-04-28
        • 2020-07-04
        • 2012-05-17
        相关资源
        最近更新 更多