当前位置: 首页 > 知识库问答 >
问题:

如何由3号飞道直接升级至5号飞道

燕嘉颖
2023-03-14

在许多生产环境中由许多客户机部署的产品上工作。它至少包含一个Spring Boot应用程序。

我们已经将flyway用于db模式迁移。从Spring Boot 1.5.x升级到2.0.x使我们的flyway版本从3.x升级到5.x。

Spring Boot迁移指南只是说在引导升级之前升级到Flyway4。然而,这将要求我们的所有客户在能够升级到最新版本之前进行中间升级。

那么,问题来了:你会如何从flyway 3直接升级到flyway 5呢?

共有1个答案

裴甫
2023-03-14

以防我不是这个星球上最后一个从3升到5的人。

问题:

我希望升级对项目上的其他开发人员是透明的,并且在对活动应用程序进行升级时不需要任何特殊的部署说明,所以我做了以下操作。

    null
Flyway bean created -> Flyway migrate called -> LocalContainerEntityManager created

解决方案:

我将引导的顺序更改为:

Flyway bean created -> Flyway3To4Migrator -> LocalContainerEntityManager created

Flyway3To4Migrator将在需要时执行schema_table更改,如果发生升级,则运行修复,然后始终运行flyway.migrate以继续迁移。

@Configuration
public class AppConfiguration {

    @Bean
    // Previously: @DependsOn("flyway")
    @DependsOn("flyway3To4Migrator")
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) {
        ...
    }

    // Previously: @Bean(initMethod = "migrate")
    @Bean
    public Flyway flyway(DataSource dataSource) {
        ...
    }
}

@Component
@DependsOn("flyway")
public class Flyway3To4Migrator {
    private final Log logger = LogFactory.getLog(getClass());
    private Flyway flyway;

    @Autowired
    public Flyway3To4Migrator(Flyway flyway) {
        this.flyway = flyway;
    }

    @PostConstruct
    public void migrate() throws SQLException, MetaDataAccessException {
        DataSource dataSource = flyway.getDataSource();

        boolean versionRankColumnExists = checkColumnExists(dataSource);
        if (versionRankColumnExists) {
            logger.info("Upgrading metadata table to the Flyway 4.0 format ...");
            Resource resource = new ClassPathResource("upgradeMetaDataTable.sql", getClass().getClassLoader());
            ScriptUtils.executeSqlScript(dataSource.getConnection(), resource);
            logger.info("Metadata table successfully upgraded to the Flyway 4.0 format.");

            logger.info("Running flyway:repair for Flyway upgrade.");
            flyway.repair();
            logger.info("Complete flyway:repair.");
        }

        logger.info("Continuing with normal Flyway migration.");
        flyway.migrate();
    }

    private boolean checkColumnExists(DataSource dataSource) throws MetaDataAccessException {
        return (Boolean) JdbcUtils.extractDatabaseMetaData(
            dataSource, dbmd -> {
                ResultSet rs = dbmd.getColumns(
                        null, null,
                        "schema_version",
                        "version_rank");
                return rs.next();
            });
    }
}

需要注意的几件事:

  • 在某个时候,我们将删除额外的Flyway3To4Migrator类,并将配置恢复到原来的状态。
  • 我从v4 Flyway jar中复制了数据库的相关UpgradeMetadataTable.sql文件,并将其简化为表名等。如果需要,您可以从Flyway中获取架构和表名。
  • SQL脚本周围没有html" target="_blank">事务管理,您可能希望添加它
  • Flyway3to4Migrator调用flyway.repair(),它比dbrepair.repairChecksumsandDescriptions()做得稍多,但我们很乐意接受数据库在运行之前必须处于良好状态
 类似资料:
  • 我把Spring靴和飞道一起用。我将FlyWay依赖项添加到我的Gradle构建文件中,如下所示: 我还添加了带有初始迁移文件的文件夹。迁移按预期进行。但现在我想使用任务进行清理。但是,当我运行这个时,我得到一个错误,说任务找不到。我用Spring靴还有别的办法吗?

  • 我正在制作一个音乐播放器来处理学校的作业。飞利浦色调灯将产生一些相应的视觉效果。我想让每首歌的视觉效果都与众不同。因此,我获取了播放曲目的封面艺术(使用LastFM API)以获得最常用的颜色,并将其用作创建其他颜色的基础。飞利浦色调有一种不同的显示颜色的方式,即HSB。所以我通过

  • PS Vita的系统软件可通过升级,追加各式各样的功能或强化安全性。使用时请随时升级为最新版本。 若要进行系统升级,需事先将连接的电脑设为以下状态。 连接互联网 安装/下载PlayStation®内容管理助手 可在以下网站进行下载。 http://cma.dl.playstation.net/cma/ 1. 在电脑确认内容管理助手是否已启动。 可从电脑的工作列确认。 2. 使用USB连接线连接PS

  • PS Vita的系统软件可通过升级,追加各式各样的功能或强化安全性。使用时请随时升级为最新版本。 若要进行升级,需事先将连接的PS3™设为以下状态。 连接互联网 系统软件升级为版本4.00以上 关闭所有使用中的应用程序,显示(用户) 1. 使用USB连接线连接PS Vita和PS3™。 2. 操作PS Vita,轻触[系统升级]>[连接至PS3™进行升级]。 可通过PS3™的网络功能,经由互联网下

  • 只需将Flyway集成到我们的应用程序中,它在以下情况下效果很好: > 全新的应用程序安装与空架构,创建schema_version表并执行完整的架构脚本,之后应用程序正在其路上。工作很棒! 有一个补丁sql脚本,我们设置的版本高于当前版本,补丁get自动应用,版本递增,这里没有问题! 现在问题是这样的:我们有旧版本的应用程序。假设我们当前的应用程序版本是7.5(模式版本1.0),当用户使用7.4

  • 我们有许多项目在许多服务器上运行,查找一个数据库,我们正在考虑为每个项目设置Flyway以控制我们的数据库结构。 但是,如果某些项目同时重新部署,我们担心并发迁移问题。(顺便说一句,我们总是在sql语法中照顾“如果存在”的事情) Flyway如何在同一数据表或其他结构发生并发更改时工作?