【问题标题】:Flyway Found non-empty schema on empty schemaFlyway 在空架构上找到非空架构
【发布时间】:2019-06-22 13:09:13
【问题描述】:

我正在尝试使用Flyway 4.2.0 + Oracle 11g 实现数据库迁移

我有这个空架构:

当我尝试迁移时,Flyway 说:

原因:org.flywaydb.core.api.FlywayException:发现非空 没有元数据表的架构“PASHA”!使用baseline() 或设置 baselineOnMigratetrue 初始化元数据表。

这是配置:

@Bean(initMethod = "migrate")
Flyway flyway() {
    Flyway flyway = new Flyway();
    flyway.setBaselineOnMigrate(false);
    flyway.setSchemas("PASHA");
    flyway.setLocations("classpath:db/migration/oracle");
    flyway.setDataSource("jdbc:oracle:thin:@host:1521:test", "login", "password");
    return flyway;
}

为什么我会收到此消息?我的基地是空的。

【问题讨论】:

    标签: java spring-boot oracle11g flyway


    【解决方案1】:

    您需要让 Flyway 自己创建架构(意味着不应该事先创建“PASHA”架构),或者以现有架构为基准(意味着使用 flyway.setBaselineOnMigrate(true) 设置您的配置)。

    基本上,Flyway 会尝试创建一个已经存在的架构(在您的示例中为“PASHA”)。

    【讨论】:

    • 你可能没有注意到,但我正在使用flyway.setBaselineOnMigrate(false);
    • 我想说的是真的,对不起。当架构和/或对象已存在于目标数据库中时,您必须设置基线。我会编辑答案。
    【解决方案2】:

    Flyway 本身使用查询来检查架构是否为空。

    In the case of oracle, the query is:

    SELECT * FROM ALL_OBJECTS WHERE OWNER = ?
    

    执行该查询(用您的所有者代替?)并查看它是否返回某些内容(确实如此)。


    例如,尚未清除的 LOB 会显示在此处。如果是这种情况,请尝试:

    purge recyclebin;
    

    现在查询应该是空的。

    【讨论】:

      【解决方案3】:

      添加所有这些都有帮助。但是没有弹簧的那个确实成功了!虽然很傻,但确实有效!

      spring.flyway.baselineOnMigrate=true
      spring.flyway.baseline-on-migrate = true
      flyway.baseline-on-migrate= true
      flyway.baselineOnMigrate=true
      

      【讨论】:

      • spring.flyway.baselineOnMigratespring.flyway.baseline-on-migrate 与另一对相同是相同的属性。
      • 是的,但是当两者都包括在内时有所帮助。没有在那里做任何更深入的调查。也许我的包对那里的两个版本都有依赖关系。
      猜你喜欢
      • 2019-01-16
      • 1970-01-01
      • 1970-01-01
      • 2016-03-17
      • 1970-01-01
      • 2013-03-08
      • 2022-08-22
      • 1970-01-01
      • 2023-04-09
      相关资源
      最近更新 更多