首次部署Spring Boot应用Flyway迁移报错:relation 'usr'不存在
以下是针对该问题的具体排查方向和解决方法:
检查Flyway迁移历史表状态
登录数据库查看Flyway自动生成的flyway_schema_history表,确认V1__Init_DB.sql的执行状态。如果V1脚本的状态为FAILED或无相关记录,说明建表脚本未成功执行。此时可删除该表中错误的历史记录,或清空表后重启应用,让Flyway重新执行所有迁移脚本。验证V1建表脚本的有效性
将V1__Init_DB.sql中的建表SQL单独复制到数据库客户端(如pgAdmin、DBeaver)执行,确认是否能成功创建usr表。重点排查语法问题:比如PostgreSQL中表名大小写敏感,若V1脚本使用CREATE TABLE "Usr"(带双引号),而V2脚本用INSERT INTO usr(小写无引号),会导致表名不匹配;或是建表语句存在语法错误(如字段类型写错、缺省值问题),导致建表失败。确认Windows环境下的迁移文件排序
Flyway严格按文件名字典序执行迁移脚本,Windows系统的文件排序可能存在大小写不敏感的情况,但Flyway会区分。确保迁移文件命名规范:V1脚本文件名在前、V2在后,无空格或特殊字符干扰。例如避免将V1脚本命名为V1__Init DB.sql(含空格),统一使用V1__Init_DB.sql格式。同时检查是否存在其他迁移文件(如V1.1版本)插入在V1和V2之间,导致执行顺序异常。检查Spring Boot的Flyway配置项
查看application.properties或application.yml中的Flyway配置:- 确认
flyway.enabled设为true - 检查
flyway.locations是否指向正确的迁移文件目录(默认是classpath:db/migration),若路径错误,Flyway会找不到V1脚本直接执行V2 - 若配置了
flyway.baseline-on-migrate=true,可能会跳过早期迁移脚本,需根据实际需求调整该配置
- 确认
排查数据库权限问题
确认应用连接数据库的用户拥有创建表的权限。若权限不足,V1脚本执行时会静默失败(或仅抛出不明显的错误),导致usr表未创建,进而引发V2脚本报错。可手动给该用户授予CREATE TABLE权限后重启应用。
内容的提问来源于stack exchange,提问作者PoToM

