Flyway多数据库基线报错:同一服务器两库V2版本脚本冲突
这是Flyway的预期行为,而非配置遗漏
Flyway的核心逻辑里,它会全局扫描所有配置的迁移目录,把找到的所有迁移脚本纳入同一个版本空间管理。哪怕你的脚本是针对不同数据库的,只要在同一次Flyway执行中被扫描到,相同版本号的脚本就会被判定为冲突——这就是你看到Found more than one migration with version 2错误的原因。
解决思路:为每个数据库单独隔离Flyway配置
你需要为两个数据库分别配置独立的Flyway上下文,让各自只扫描对应目录下的迁移脚本。以Maven为例,最常用的方式是通过Profile来区分:
- 在
pom.xml中添加两个Profile,分别对应db1和db2:
<profiles> <profile> <id>db1</id> <properties> <!-- 指定db1的迁移脚本目录 --> <flyway.locations>filesystem:db/migration/db1</flyway.locations> <!-- db1的数据库连接信息 --> <flyway.url>jdbc:your-db://localhost/db1</flyway.url> <flyway.user>your-db-user</flyway.user> <flyway.password>your-db-password</flyway.password> </properties> </profile> <profile> <id>db2</id> <properties> <!-- 指定db2的迁移脚本目录 --> <flyway.locations>filesystem:db/migration/db2</flyway.locations> <!-- db2的数据库连接信息 --> <flyway.url>jdbc:your-db://localhost/db2</flyway.url> <flyway.user>your-db-user</flyway.user> <flyway.password>your-db-password</flyway.password> </properties> </profile> </profiles>
- 分别执行基线操作:
- 针对db1:
mvn flyway:baseline -P db1 - 针对db2:
mvn flyway:baseline -P db2
这样每次执行Flyway命令时,只会加载对应数据库的迁移目录,版本号就不会冲突了。
额外说明
Flyway的版本号是绑定到单个迁移上下文的,每个数据库都应该有自己独立的版本序列。如果把多个数据库的脚本混在同一个扫描范围内,Flyway无法区分它们属于哪个库,自然会把相同版本号视为重复。
内容的提问来源于stack exchange,提问作者swille




