如何使用 flyway 跳过特定的迁移?

Posted

技术标签:

【中文标题】如何使用 flyway 跳过特定的迁移?【英文标题】:How to skip a specific migration with flyway? 【发布时间】:2015-05-14 17:49:41 【问题描述】:

我正在使用带有 gradle 的 flyway,我已经在数据库控制台中手动运行了其中一个迁移,我想运行 flyway,但告诉它忽略所有其他迁移版本之间的一个特定迁移版本。这可以做到吗?

【问题讨论】:

【参考方案1】:

你必须稍微修改一下才能让它工作,所以我不推荐这种方法,但它会在紧要关头工作。

我只用 Maven 测试过这个,但我很确定它也适用于 Gradle。

    迁移到您手动应用的版本之前的版本

    # Assuming you applied 01.002 manually
    $ mvn flyway:migrate -Dflyway.target=01.001
    

    为您应用的脚本插入一行

    -- Make sure these vals closely replicate those from other rows
    insert into schema_version( installed_rank, version, description, type, script, checksum, installed_by, installed_on, execution_time, success) 
    values ( 2, '01.002', 'static_data', 'SQL', 'V01/V01.002__static_data.sql', null, 'username', current_timestamp, 0, true );
    

    修复schema_version校验和

    $ mvn flyway:repair
    

    应用其他迁移

    $ mvn flyway:migrate -Dflyway.validateOnMigrate=false -Dflyway.outOfOrder=true
    

那里的两个-D 属性可能不需要,这取决于您是否得到insert 正确与否。 Flyway 可能不同意您的脚本描述,例如,即使校验和现在是正确的。

【讨论】:

有时不需要插入精心设计的insert(例如,如果您的升级脚本在添加现有列或删除已删除的表时失败)。只需通过设置success = 1 允许 Flyway 失败并修复最新线路。您可以在更新脚本的开头使用垃圾进行安全失败(防止进一步可能的危险操作)。只需在flyway:repair 之前清除垃圾【参考方案2】:

不推荐但如果你仍然想:

1) 运行flywayMigrate,让迁移失败。 2) 手动更新该特定版本迁移的 flyway 元表(成功列)。 3) 再次运行 flywayMigrate。 4) 完成,flyway 现在将开始下一个版本的迁移。

【讨论】:

像魅力一样工作。谢谢!【参考方案3】:

从版本 7 开始,您可以将其直接添加到您的 Maven 或 Grade 文件中

Gradle - 跳过

flyway 
     skipExecutingMigrations = true

Maven - 跳过

<configuration>
     <skipExecutingMigrations>true</skipExecutingMigrations>
</configuration>

Documentation Reference Skip

Gradle - 樱桃采摘

flyway 
     cherryPick = '2.0'

Maven - 樱桃采摘

<configuration>
     <cherryPick>2.0</cherryPick>
</configuration>

Documentation Reference Cherry Pick

【讨论】:

请注意,参数“skipExecutingMigrations”是 Teams 版本的功能。这意味着您必须付费才能使用此功能。

以上是关于如何使用 flyway 跳过特定的迁移?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Flyway 回滚迁移?

最佳实践:使用后如何修改flyway迁移脚本

如何将 Flyway 迁移与单个架构和多个项目一起使用

使用flyway迁移脚本时如何从文件中填写表格

flyway mysqldump迁移

使用 Flyway 迁移存储过程