代码之家  ›  专栏  ›  技术社区  ›  Max N.

设置新基线后更改飞行路线迁移文件

  •  5
  • Max N.  · 技术社区  · 8 年前

    我的一个项目中集成了flyway。我有很多迁移,迁移一个新的空数据库需要很长时间,主要是因为在迁移过程中还添加了种子数据。现在我想改变这一点。不幸的是,这些迁移已经被推到生产环境中(是的,在某些时候,种子数据也被迁移到了生产环境中)。

    我的想法是为生产系统的当前版本设置一个基线,然后清理旧的迁移:压缩模式迁移,并将种子和测试数据移动到一个新位置,而不是部署到生产中。

    现在我的问题是:

    1. 如何在不影响所有其他数据库的情况下,在生产数据库中设置基线?呼叫 flyway baseline ... 直接在数据库上?或者我可以使用任何类型的特殊迁移文件吗?可以将基线直接写入 schema_version 数据库的表?这样的查询是什么样子的?
    2. 我最新的迁移是 V4_6_3__... .所以我的基准线必须是 V5__... ? 或者 V4__... 是否包含了足够多且具有相同主版本的所有迁移?
    3. 设置基线后,是否可以/保存添加、编辑和删除早于基线的迁移,而不会在下一个迁移任务中中断我的生产数据库?

    很抱歉提出这些基本问题,但在我看来,flyway文档毫无帮助。。。

    提前感谢!

    2 回复  |  直到 8 年前
        1
  •  3
  •   Community CDub    7 年前

    Sry,因为回答晚了。我做了一件非常类似的事情 @markdsievers 建议:

    我保证生产环境至少在版本上 X ( flyway.setTarget(X) ). 然后,我更改为一个新的模式版本表( flyway.setTable('temporary_schema_version') )并运行了一次迁移,删除了旧表。之后,我将模式版本表更改回原始版本表,并将基线设置为版本 Y > X 并运行另一个迁移,删除临时表。

    现在,我可以编辑/挤压/删除版本低于的所有迁移 Y 而不会破坏我的生产部署。

        2
  •  2
  •   markdsievers    8 年前

    我经历了一个非常类似的场景,甚至编写了我们自己的内部工具,称为“Rebase”,它可以完成您想要的大部分功能。我们的主要动机是从Flyway 3.x升级到4.3,但我们也有一个巨大的历史需要被粉碎。其要点如下:

    1. 将所有迁移压缩到任何有意义的迁移中。我通常有 V2__base_ddl.sql V3__base_data.sql (Flyway可以使用前两个版本号创建模式等)。这是手动部分。
    2. schema_version 表并将其删除。
    3. 然后,重新设置基础工具运行 init + migrate 使用新的基线版本集。
    4. 重设基准工具留下了一个示意图(自定义表中的重设基准键),表明它已经完成。

    对于我的集成测试构建(即构建一个普通数据库并迁移到最新版本),我使用Flyways添加了一个额外的测试数据SQL脚本文件夹 locations 参数,从而确保我有集成测试的测试数据,但不在任何非测试环境中。

    Flyway Java API,在prestep中添加,以便在配置后重新设置基础,然后委托给Flyway。