You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何阻止Liquibase迁移PostgreSQL的public schema仅迁移指定schema

问题原因分析

你当前的Liquibase配置同时定义了SpringLiquibase和MultiTenantSpringLiquibase两个Bean:

  • 普通的SpringLiquibase未指定任何schema,会默认对public schema执行变更日志;
  • 多租户的liquibaseMt虽然指定了001和002,但第一个Bean的存在会额外触发public schema的迁移,这就是问题的核心。
解决方案

方案1:移除多余的SpringLiquibase Bean(推荐)

直接删除第一个liquibase Bean,仅保留多租户配置的Bean即可。因为你的需求是仅对001和002执行变更,不需要单独处理public schema。修改后的配置类如下:

@Configuration
@EnableConfigurationProperties({LiquibaseProperties.class})
public class LiquibaseConfiguration {

  private final Logger log = LoggerFactory.getLogger(LiquibaseConfiguration.class);

  private final Environment env;

  public LiquibaseConfiguration(Environment env) {
    this.env = env;
  }

  @Bean
  public MultiTenantSpringLiquibase liquibaseMt(DataSource dataSource, LiquibaseProperties liquibaseProperties) {
    MultiTenantSpringLiquibase liquibase = new MultiTenantSpringLiquibase();
    liquibase.setDataSource(dataSource);
    liquibase.setChangeLog("config/liquibase/changelog/changelog-root.xml");
    liquibase.setSchemas(Arrays.asList("001", "002"));
    // 可选:指定Liquibase系统表(如databasechangelog)统一存储的schema,默认会在每个目标schema创建
    // liquibase.setLiquibaseSchema("001");
    return liquibase;
  }
}

方案2:保留SpringLiquibase但禁用其执行

如果因特殊需求必须保留第一个Bean,可通过配置禁用它的迁移逻辑:

@Bean
public SpringLiquibase liquibase(@Qualifier("taskExecutor") TaskExecutor taskExecutor,
    DataSource dataSource, LiquibaseProperties liquibaseProperties) {
  SpringLiquibase liquibase = new SpringLiquibase();
  liquibase.setDataSource(dataSource);
  liquibase.setChangeLog("config/liquibase/changelog/changelog-root.xml");
  // 禁用该Bean的迁移执行
  liquibase.setShouldRun(false);
  return liquibase;
}

@Bean
@DependsOn("liquibase")
public MultiTenantSpringLiquibase liquibaseMt(DataSource dataSource, LiquibaseProperties liquibaseProperties) {
  MultiTenantSpringLiquibase liquibase = new MultiTenantSpringLiquibase();
  liquibase.setDataSource(dataSource);
  liquibase.setChangeLog("config/liquibase/changelog/changelog-root.xml");
  liquibase.setSchemas(Arrays.asList("001", "002"));
  return liquibase;
}
额外注意事项
  • 检查你的变更日志文件,如果有硬编码指定public schema的语句(如<createTable schemaName="public"...>),需要修改这些代码,移除固定schema引用或替换为动态变量,确保变更只作用于目标租户schema。
  • 你的DataSource连接URL无需额外指定currentSchema,MultiTenantSpringLiquibase会自动针对每个指定的schema切换上下文执行迁移。

内容的提问来源于stack exchange,提问作者bobbyrne01

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 11:20:29