跨多个目录迁移版本

Posted

技术标签:

【中文标题】跨多个目录迁移版本【英文标题】:Migration versions across multiple directories 【发布时间】:2013-01-16 05:48:16 【问题描述】:

如果我想在多个目录中组织我的迁移(假设我正在使用 SQL 迁移,并且在“sql”目录下我有一个“主”目录,然后是一个“特殊”目录)。

所以在 sql/main 下我有 "V1.1__some_change" 等。

然后我也想将其他迁移放在 sql/special 下。但是迁移版本号必须在所有目录中不同,例如,我不能将“V1.1__some_other_change”放在 sql/special 中,因为它会导致冲突。

但是跨多个不同目录管理线性版本号并不容易。有没有解决这个问题的好方法?

希望这个问题很清楚。

【问题讨论】:

【参考方案1】:

这一切都取决于为什么 special 是 “特殊” 以及它如何与“main”相关

如果它们具有相同的生命周期,您可以使用不同的编号方案(主版本中的整数,特殊版本中的点版本)或在共享资源(白板、维基页面、 ...) 以便于知道下一个可用的是哪个。

如果它们有单独的生命周期,您可以使用单独的 Flyway 实例跟踪它们(每个实例都有不同的 flyway.table)。

【讨论】:

谢谢。它们确实具有相同的生命周期。使用“main”和“special”实际上是一个不好的例子。您对特殊点发布的想法可能会奏效,但所有目录实际上都具有相同的“重要性”。出于组织目的,它们只是按主题划分。现在,我决定只使用完整的日期/时间戳作为版本号,以便或多或少保证它们是唯一的,并保持所有目录的迁移顺序。【参考方案2】:

今天我遇到了同样的问题。我将 Flyway 1.7 更新为最新版本 2.0.3。 而且我注意到迁移不再像在 1.7 版中那样工作了。

我们使用基础文件夹 (db.migrations) 的不同子文件夹来保存不同数据库方案的迁移,这些数据库方案具有独立的生命周期和自己的 schema_version 表:

src->main->resources->db.migrations
 ->business_partitions
     -> V1_1__BUSINESS_PARTITION_INDEXES.sql
     -> V1__BUSINESS_PARTITios.sql
 ->tech
     -> V1_1__TECH_CERTIFICATES_AND_DECRYPTORS_TABLES.sql
     -> V1__TECH.sql
     -> V2__JMS.sql
 ->view
     -> V1__PARTITION11_DB_CREATION_SCRIPT_VIEWS.sql

当我们今天使用 Java 中的以下行执行数据库迁移时:

Flyway flyway = new Flyway();
flyway.setDataSource(dataSource);
flyway.setLocations("db.migrations.business_partitions");
flyway.migrate();

没有进行任何迁移。

我深入研究了 flyway 源代码,发现问题是位置在 CompositeMigrationResolver 类的 mergeLocations() 方法中被过滤掉了。

在那里,我的位置被过滤掉了,因为 business_partitions 是 db.migrations 的子文件夹,是 BaseDir 和 BasePackage 的默认值。

我通过明确设置 BaseDir 和 BasePackage 来解决问题:

flyway.setBaseDir("db.migrations.business_partitions");
flyway.setBasePackage("db.migrations.business_partitions");

我了解到这两种方法将在 flyway 3 中被弃用,所以也许这也可以解决我们的问题。

【讨论】:

这些方法很麻烦,在单片机中已经没有了。这应该在 2.1 中再次按预期工作

以上是关于跨多个目录迁移版本的主要内容,如果未能解决你的问题,请参考以下文章

Karmada跨集群优雅故障迁移特性解析

微软虚拟化跨版本迁移

从11g到18c - Oracle Database跨平台跨版本升级迁移和整合

微软Hyper-V虚拟化跨版本迁移

HBase跨版本数据迁移总结

Hive跨集群和版本迁移