不同数据源的不同迁移场景

Posted

技术标签:

【中文标题】不同数据源的不同迁移场景【英文标题】:Different migration scenarios for different datasources 【发布时间】:2021-11-02 22:18:32 【问题描述】:

朋友们,如何使用Flyway配置多个数据库的迁移?在我的 Spring 应用程序中,我使用了 2 个数据库,第一个数据库(PostgreSQL)负责 Web,它存储用户、角色等数据,第二个数据库(mysql)负责业务逻辑。数据库位于不同的主机上,并且没有以任何方式相互连接。当然,我的数据源具有不同的数据结构。

我已经配置了两个数据源,分别是LocalDBConfig和JiraDBConfig。

@Configuration
@PropertySource(  "classpath:application.properties"  )
@EnableJpaRepositories(
        basePackages = "net.komus.oksitreport.repo.local",
        entityManagerFactoryRef = "localEntityManager",
        transactionManagerRef = "localTransactionManager"
)
public class LocalDBConfig 
    
    @Primary
    @Bean
    @ConfigurationProperties( prefix = "spring.datasource" )
    @FlywayDataSource
    public DataSource customerDataSource() 
        return DataSourceBuilder.create().build();
    
    
    @Bean(name = "localEntityManager")
    @Primary
    public LocalContainerEntityManagerFactoryBean localEntityManager() 
        ...
    
    
    @Bean
    @Primary
    public PlatformTransactionManager localTransactionManager() 
        ...
    
    

@Configuration
@PropertySource(  "classpath:application.properties"  )
@EnableJpaRepositories(
        basePackages = "net.komus.oksitreport.repo.jira",
        entityManagerFactoryRef = "jiraEntityManager",
        transactionManagerRef = "jiraTransactionManager"
)
public class JiraDBConfig 
    
    @Bean
    @ConfigurationProperties( prefix = "db.jira.datasource" )
    @FlywayDataSource
    public DataSource jiraDataSource() 
        return DataSourceBuilder.create().build();
    
    
    @Bean(name = "jiraEntityManager")
    public LocalContainerEntityManagerFactoryBean jiraEntityManager() 
        ...
    
    
    @Bean
    public PlatformTransactionManager jiraTransactionManager() 
        ...
    
    

我已经按路径排列了迁移文件:

db/migrate/manager 路径应负责本地数据库配置迁移,db/migrate/jira 路径应负责 JiraDBConfig 迁移。 我不明白如何配置我需要的功能。

【问题讨论】:

【参考方案1】:

我想你快到了。据我所知,没有开箱即用的方式让 flyway 同时处理两个数据库迁移。话虽如此,有一种方法可以通过一些手动配置来做到这一点。因此,根据您的要求考虑以下示例:

@Configuration
public class PostgresDbConfiguration 

    @Primary
    @Bean(name = "postgresDatasource")
    @ConfigurationProperties(prefix = "primary.datasource")
    @FlywayDataSource
    public DataSource dataSource() 
        return DataSourceBuilder.create().build();
    


@Configuration
public class MariaDbConfiguration 

    @Bean(name = "mariaDatasource")
    @ConfigurationProperties(prefix = "secondary.datasource")
    public DataSource dataSource() 
        return DataSourceBuilder.create().build();
    


对于我们的用例,这将是我们将要迁移的两个数据库(以及后续数据源)。如您所见,我的postgresDatasource 被标记为@Primary

对于主数据源,我们将让 Flyway 做自己的事情,因此需要进行的唯一配置如下:

spring.flyway.locations=classpath:db/migration/postgresql

对于辅助数据源 (mariaDatasource),您需要做的是创建一个 Flyway bean,它将手动迁移数据库。例如考虑以下内容:

@Configuration
public class FlywayConfig 

    private final DataSource mariaDatasource;

    public FlywayConfig(@Qualifier("mariaDatasource") DataSource mariaDatasource) 
        this.mariaDatasource = mariaDatasource;
    

    @PostConstruct
    public void runMigration() 
        Flyway.configure()
            .dataSource(mariaDatasource)
            .locations("db/migration/mariadb")
            .baselineOnMigrate(true)
            .load()
            .migrate();
    


如您所见,这个类被注入辅助数据源,用于手动创建Flyway 对象。然后它使用相关对象手动执行迁移。

【讨论】:

@akotex,谢谢,你的例子帮我解决了问题 如果对您有帮助请点赞 @akotex,我真的很想这样做,但我的名声仍然很小:-)

以上是关于不同数据源的不同迁移场景的主要内容,如果未能解决你的问题,请参考以下文章

阿里云RDS实例内不同数据库之间的数据迁移

ClickHouse 大数据量的迁移方式

Exchange Server 2016管理系列课件07.用户在不同数据库的迁移

RabbitMQ通过shovel插件迁移数据

实践丨RabbitMQ通过shovel插件迁移数据

启动后如何运行 Grails 数据库迁移