找到没有元数据表的非空模式`schema_name`

Posted

技术标签:

【中文标题】找到没有元数据表的非空模式`schema_name`【英文标题】:Found non-empty schema `schema_name` without metadata table 【发布时间】:2019-06-29 04:22:01 【问题描述】:

我研究了这个问题并发现了类似的问题,但没有一个问题的答案适合我。

在尝试运行 Spring 应用程序时,由于启动 ApplicationContext 出错而失败。

此错误是 FlywayException 的结果

这个问题似乎出现了,因为数据库已经有一个名为“schema_name”的模式,而当它发现这个非空模式时,flyway 不知道如何反应。该架构被产品代码中的更多包和类使用,没有飞路问题。

架构已经有一个以 Flyway Baseline 开头的 flyway_schema_history 表。

错误输出如下图:

Invocation of init method failed; nested exception is org.flywaydb.core.api.FlywayException: Found non-empty schema `schema_name` without metadata table! Use baseline() or set baselineOnMigrate to true to initialize the metadata table.

我已尝试设置 flyway.baselineOnMigrate = true 但这会导致另一个问题,即 flyway 尝试运行最初添加数据库表的 SQL 文件 - 因为它们存在显然不能!

我的 application.properties 文件包含以下数据源代码:

spring.datasource.url=jdbc:mysql://localhost:3306/schema_name
spring.datasource.username=user
spring.datasource.password=pass
spring.jpa.hibernate.ddl-auto=update

pom 文件包含 flyway 依赖项,其中 flyway.version 为 5.0.7:

<dependency>
    <groupId>org.flywaydb</groupId>
    <artifactId>flyway-core</artifactId>
    <version>$flyway.version</version>
</dependency>

有没有人遇到过类似的问题?

更新

我尝试了第一个答案,其中我添加了 fly.baselineOnMigrate 并拿走了休眠线,但收到以下错误:

2019-02-06 10:07:32.233 INFO 82403 --- [ main] o.f.c.i.dbsupport.DbSupportFactory : Database: jdbc:mysql://localhost:3306/schema_name (MySQL 5.7) 2019-02-06 10:07:32.272 INFO 82403 --- [ main] o.f.core.internal.command.DbValidate : Validated 31 migrations (execution time 00:00.027s) 2019-02-06 10:07:32.318 INFO 82403 --- [ main] o.f.c.i.metadatatable.MetaDataTableImpl : Creating Metadata table: schema_name.schema_version 2019-02-06 10:07:32.379 INFO 82403 --- [ main] o.f.core.internal.command.DbBaseline : Schema baselined with version: 1 2019-02-06 10:07:32.395 INFO 82403 --- [ main] o.f.core.internal.command.DbMigrate : Current version of schema schema_name: 1 2019-02-06 10:07:32.395 INFO 82403 --- [ main] o.f.core.internal.command.DbMigrate : Migrating schema schema_name to version 2.0 - Creates TABLE_NAME tables 2019-02-06 10:07:32.407 WARN 82403 --- [ main] o.f.c.internal.dbsupport.JdbcTemplate : DB: Table 'TABLE_NAME' already exists (SQL State: 42S01 - Error Code: 1050) 2019-02-06 10:07:32.409 ERROR 82403 --- [ main] o.f.core.internal.command.DbMigrate : Migration of schema schema_name to version 2.0 failed! Please restore backups and roll back database and code!

【问题讨论】:

【参考方案1】:

首先,您必须通过将其值设置为 none 来禁用此选项 spring.jpa.hibernate.ddl-auto 或将其删除,因为它会导致 Hibernate 更新您的数据库架构,但您有一个 Flyway。正如documentation 中所述,此属性

自动验证模式 DDL 或将其导出到数据库 SessionFactory 已创建

第二件事,您必须添加此 flyway.baselineOnMigrate = true 属性,以使 Flyway 与您的非空架构一起工作。由于您的 Hibernate 现在不会使用任何数据填充您的架构,因此您不会遇到现有表的问题。

【讨论】:

感谢@Stanislav 的回复,但不幸的是它仍然无法正常工作。我仍然收到迁移错误,因为程序仍然尝试添加现有表,即使已经取出 spring.jpa.hibernate.ddl-auto 行。我已经编辑了原始问题以显示新的错误输出 您确定 TABLE_NAME 在您运行应用程序之前不存在并且不是由其他系统创建的吗?如果您确定该表应该由您的应用程序而不是其他人创建,那么您是否在数据库上运行您的应用程序,您之前从未使用hibernate.ddl-auto 运行过?如果您的应用失败,它不会删除由 Hibernate 预览创建的表 看来问题只是flyway版本不匹配。我有其他软件包在非常相似的设置下工作,唯一的区别是使用的 flyway 版本!我想更新的 flyway 版本会选择 flyway_schema_history 表作为元数据表

以上是关于找到没有元数据表的非空模式`schema_name`的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Oracle 中动态分析给定模式名和表名的元数据?

当字典中没有匹配的非空值时,返回null。

List和String的非空判断

Azure 流分析 - 您可以查询最新的非空值吗?

计算Spark DataFrame中的非空值的数量

在 PySpark 中为每一行查找最新的非空值