Flyway 一个模式中的多个元数据表

Posted

技术标签:

【中文标题】Flyway 一个模式中的多个元数据表【英文标题】:Flyway multiple metadata tables in one schema 【发布时间】:2017-08-23 06:26:54 【问题描述】:

我正在尝试使用 Flyway 对模块化应用程序的数据库进行版本控制。每个模块都有自己独立的一组表,以及将控制该组表的版本控制的迁移脚本。

Flyway 允许我为每个模块指定不同的元数据表——这样我可以独立地对每个模块进行版本控制。当我尝试升级应用程序时,我为每个模块运行一个迁移过程,每个模块都有自己的表和一组脚本。请注意,这些表都在同一个架构中。

但是,当我尝试迁移我的应用程序时,第一次迁移是唯一有效的迁移。后续迁移失败,出现以下异常:org.flywaydb.core.api.FlywayException: Found non-empty schema(s) "public" without metadata table! Use baseline() or set baselineOnMigrate to true to initialize the metadata table.

如果我为每个模块手动创建元数据表,每个模块的迁移工作正常。自己创建表格而不是让 Flyway 为我创建表格似乎是解决问题的技巧,而不是解决方案本身。

这是独立管理多组表的有效方法,还是有更好的方法?自己创建元数据表是否有效?

【问题讨论】:

【参考方案1】:

对您来说理想的解决方案是将模块拆分为模式。这为您提供了每个模块的有效隔离单元,并且自然适合模块化应用程序(模块完全隔离和自我管理),而不是将所有内容转储到单个模式(尤其是公共模式)中。例如

application_database
    ├── public
    ├── module_1
    │   ├── schema_version
    │   ├── m1_t1
    │   └── m1_t2
    ├── module_2
    │   ├── schema_version
    │   ├── m2_t1
    │   └── m2_t2
    ...

您的第二个选择是继续使用公共架构来托管所有表,但为每个 schema_version 使用单独的架构。与上面提到的相比,这减少了重构工作,但肯定是一个不那么优雅的设计。例如

application_database
    ├── public
    │   ├── m1_t1
    │   ├── m1_t2
    │   ├── m2_t1
    │   └── m2_t2
    ├── module_1
    │   └── schema_version
    │
    ├── module_2
    │   └── schema_version
    ...

【讨论】:

【参考方案2】:

我认为您需要在执行迁移之前为每个模块设置基线。您需要传递 table 选项来覆盖每个模块的 schema_version,例如flyway.table=schema_version_module1。正如错误消息所暗示的那样,您也可以使用baselineOnMigrate,但是在文档中警告不要这样做 (https://flywaydb.org/documentation/commandline/migrate)。

我们正在考虑使用另一个 schema_version 表的类似方法来应用和记录无法完全推广到每个环境的数据修复。

【讨论】:

以上是关于Flyway 一个模式中的多个元数据表的主要内容,如果未能解决你的问题,请参考以下文章

生产数据库中的 Flyway 集成

Flyway 3.1 数据库迁移多个模式 - Oracle 11g

改进 ODBC 和 JDBC API 中的雪花元数据调用

Flyway 数据库迁移到多个模式

删除 H2 数据库中的元数据(信息模式)

使用 Flyway 在多个模式上运行 SQL 脚本