You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Flyway多数据库基线报错:同一服务器两库V2版本脚本冲突

这是Flyway的预期行为,而非配置遗漏

Flyway的核心逻辑里,它会全局扫描所有配置的迁移目录,把找到的所有迁移脚本纳入同一个版本空间管理。哪怕你的脚本是针对不同数据库的,只要在同一次Flyway执行中被扫描到,相同版本号的脚本就会被判定为冲突——这就是你看到Found more than one migration with version 2错误的原因。

解决思路:为每个数据库单独隔离Flyway配置

你需要为两个数据库分别配置独立的Flyway上下文,让各自只扫描对应目录下的迁移脚本。以Maven为例,最常用的方式是通过Profile来区分:

  1. 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>
  1. 分别执行基线操作:
  • 针对db1:mvn flyway:baseline -P db1
  • 针对db2:mvn flyway:baseline -P db2

这样每次执行Flyway命令时,只会加载对应数据库的迁移目录,版本号就不会冲突了。

额外说明

Flyway的版本号是绑定到单个迁移上下文的,每个数据库都应该有自己独立的版本序列。如果把多个数据库的脚本混在同一个扫描范围内,Flyway无法区分它们属于哪个库,自然会把相同版本号视为重复。

内容的提问来源于stack exchange,提问作者swille

火山引擎 最新活动