找到没有元数据表的非空模式`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`的主要内容,如果未能解决你的问题,请参考以下文章