Spring Boot 2.0.2.RELEASE中FlyWay无报错却无法初始化求助
Hey Tonya,花了好几个小时排查却没进展确实让人头疼,我帮你整理几个关键的排查方向,你可以逐一验证:
1. 检查YAML配置的缩进正确性
YAML对缩进非常敏感,从你提供的application.yml片段来看,spring.profiles: default应该放在根节点,而spring:下的子配置(flyway、datasource等)需要保持一致的缩进层级。正确的结构应该是:
spring.profiles: default spring: flyway: url: jdbc:mysql://localhost:3306/test_schema?tinyInt1isBit=false user: adminuser password: adminuser datasource: url: jdbc:mysql://localhost:3306/test_schema?tinyInt1isBit=false username: restricteduser password: restricteduser driver-class-name: com.mysql.jdbc.Driver # 其他jpa配置...
如果flyway的配置没有正确缩进在spring节点下,Spring Boot将无法识别这些配置,FlyWay会使用默认行为甚至不启动。
2. 启用FlyWay的DEBUG日志排查细节
你的当前日志只输出到INFO级别,FlyWay的初始化、脚本加载、数据库连接等关键细节不会被打印。可以在application.yml中添加日志级别配置:
logging: level: org.flywaydb: DEBUG
重启应用后,你就能看到FlyWay是否加载了迁移脚本、是否尝试连接数据库、执行过程中是否有隐藏的异常等信息,这是排查此类无报错问题最有效的方法。
3. 检查迁移脚本的语法与命名规范
你的迁移脚本V1__create_test_schema.sql存在一个明显的语法错误:PRIMARY KEY (id),这一行末尾多了一个逗号,MySQL执行时会抛出语法异常。虽然你没看到报错,但很可能是日志级别不足导致异常被隐藏。
另外,确认脚本命名严格符合FlyWay规范:V<版本号>__<描述>.sql(注意是两个下划线),你的命名是符合要求的,但要确保脚本文件没有被IDE忽略,或者路径src/main/resources/db/migration没有拼写错误。
4. 确认FlyWay自动配置未被禁用
检查你的启动类是否添加了排除FlyWay自动配置的注解:
@SpringBootApplication(exclude = FlywayAutoConfiguration.class)
或者application.yml中是否存在禁用配置:
spring: flyway: enabled: false
如果有上述配置,FlyWay将不会自动初始化。
5. 验证数据库权限与连接
虽然你的初始化脚本给了adminuser足够的权限,但可以手动用adminuser连接数据库,尝试创建flyway_schema_history表(FlyWay 5.x+默认的迁移记录表),确认该用户确实有创建表的权限。同时,检查flyway.url中的数据库地址、端口、schema名称是否正确,确保数据库服务正常运行。
6. 检查依赖兼容性
Spring Boot 2.0.2.RELEASE默认依赖的FlyWay版本是5.0.7,你可以通过Maven命令查看依赖树,确认没有引入冲突的FlyWay版本:
mvn dependency:tree | grep flyway
如果存在多个版本的FlyWay依赖,可能会导致初始化异常。
先从调整日志级别开始排查,这应该能帮你找到最直接的问题原因,祝你顺利解决!
内容的提问来源于stack exchange,提问作者Nephthys76

