Spring环境下Flyway读取PUBLIC.schema_version元数据表迁移列表报错
解决Spring Boot启动时Flyway元数据表读取异常问题
你碰到的这个问题我之前排查过好几次,核心就是Flyway没法正常读取PUBLIC.schema_version这个迁移元数据表,导致flywayInitializer Bean初始化失败。给你几个针对性的解决思路,按顺序试大概率能搞定:
可能的原因及解决方案
1. 数据库用户权限不够
Flyway要读取schema_version表,必须要有SELECT权限。你可以登录数据库,执行下面的SQL检查并补全权限:
-- 先检查当前用户的权限 SHOW GRANTS FOR '你的数据库用户名'@'你的主机地址'; -- 如果没有SELECT权限,就赋予它 GRANT SELECT ON PUBLIC.schema_version TO '你的数据库用户名'@'你的主机地址'; FLUSH PRIVILEGES;
2. 元数据表损坏或丢了
如果PUBLIC.schema_version表被误删、结构损坏,Flyway肯定读不了数据:
- 测试环境:直接删了这个表(如果还存在),重启应用后Flyway会自动重建并初始化元数据表:
DROP TABLE IF EXISTS PUBLIC.schema_version; - 生产环境:先备份表数据,然后对比正常环境的表结构,修复损坏的字段或索引,实在不行就从备份恢复。
3. Flyway版本太老,和数据库不兼容
你用的Flyway是3.2.1版本,这版本挺旧的,可能和你当前的数据库版本存在兼容性问题。建议升级到较新的稳定版本:
如果是Maven项目,修改pom.xml里的依赖:
<dependency> <groupId>org.flywaydb</groupId> <artifactId>flyway-core</artifactId> <version>7.15.0</version> <!-- 换成最新的稳定版就行 --> </dependency>
4. Flyway配置写错了
检查你的application.properties或application.yml里的Flyway配置,确认schema名称是不是指向了PUBLIC:
# 确保默认schema配置正确 flyway.default-schema=PUBLIC
要是配置了错误的schema,Flyway自然找不到对应的元数据表。
5. 数据库连接本身有问题
先确认数据库服务正常跑着,应用的数据库连接URL、用户名、密码都配置对了。可以先用数据库客户端手动连一下,排除网络或者配置错误的问题。
完整错误日志
org.springframework.beans.factory.BeanCreationException: 创建名为'flywayInitializer'的Bean失败,该Bean定义在类路径资源[org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]中:初始化方法调用失败;嵌套异常为org.flywaydb.core.api.FlywayException: 从元数据表"PUBLIC"."schema_version"获取已应用迁移列表时出错 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1578) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:296) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE] at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1054) ~[spring-context-4.2.4.RELEASE.jar:4.2.4.RELEASE] at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:829) ~[spring-context-4.2.4.RELEASE.jar:4.2.4.RELEASE] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538) ~[spring-context-4.2.4.RELEASE.jar:4.2.4.RELEASE] at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118) ~[spring-boot-1.3.1.RELEASE.jar:1.3.1.RELEASE] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:764) [spring-boot-1.3.1.RELEASE.jar:1.3.1.RELEASE] at org.springframework.boot.SpringApplication.doRun(SpringApplication.java:357) [spring-boot-1.3.1.RELEASE.jar:1.3.1.RELEASE] at org.springframework.boot.SpringApplication.run(SpringApplication.java:305) [spring-boot-1.3.1.RELEASE.jar:1.3.1.RELEASE] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1124) [spring-boot-1.3.1.RELEASE.jar:1.3.1.RELEASE] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1113) [spring-boot-1.3.1.RELEASE.jar:1.3.1.RELEASE] at com.boot.App.main(App.java:16) [classes/:na] Caused by: org.flywaydb.core.api.FlywayException: 从元数据表"PUBLIC"."schema_version"获取已应用迁移列表时出错 at org.flywaydb.core.internal.metadatatable.MetaDataTableImpl.findAppliedMigrations(MetaDataTableImpl.java:248) ~[flyway-core-3.2.1.jar:na] at org.flywaydb.core.internal.metadatatable.MetaDataTableImpl.allAppliedMigrations(MetaDataTableImpl.java:182) ~[flyway-core-3.2.1.jar:na] at org.flywaydb.core.internal.info.MigrationInfoServiceImpl.refresh(MigrationInfoServiceImpl.java:97) ~[flyway-core-3.2.1.jar:na] at org.flywaydb.core.internal.command.DbValidate$2.doInTransaction(DbValidate.java:136) ~[flyway-core-3.2.1.jar:na] at org.flywaydb.core.internal.command.DbValidate$2.doInTransaction(DbValidate.java:131) ~[flyway-core-3.2.1.jar:na] at org.flywaydb.core.internal.util.jdbc.TransactionTemplate.execute(TransactionTemplate.java:72) ~[flyway-core-3.2.1.jar:na] at org.flywaydb.core.internal.command.DbValidate.validate(DbValidate.java:131) ~[flyway-core-3.2.1.jar:na] at org.flywaydb.core.Flyway.doValidate(Flyway.java:1102) ~[flyway-core-3.2.1.jar:na] at org.flywaydb.core.Flyway.access$300(Flyway.java:62) ~[flyway-core-3.2.1.jar:na] at org.flywaydb.core.Flyway$1.execute(Flyway.java:1012) ~[flyway-core-3.2.1.jar:na] at org.flywaydb.core.Flyway$1.execute(Flyway.java:1006) ~[flyway-core-3.2.1.jar:na] at org.flywaydb.core.Flyway.execute(Flyway.java:1418) ~[flyway-core-3.2.1.jar:na] at org.flywaydb.core.Flyway.migrate(Flyway.java:1006) ~[flyway-core-3.2.1.jar:na] at org.springframework.boot.autoconfigure.flyway.FlywayMigrationInitializer.afterPropertiesSet(FlywayMigrationInitializer.java:66) ~[spring-boot-autoconfigure-1.3.1.
内容的提问来源于stack exchange,提问作者Hugi
相关产品推荐
相关产品推荐

