【问题标题】:Postgres: How to create index concurrently using liquibasePostgres:如何使用 liquibase 同时创建索引
【发布时间】:2019-11-05 05:57:11
【问题描述】:

查看 liquibase 文档 http://www.liquibase.org/documentation/changes/create_index.html,CIC 无法使用创建索引,因为 liquibase 没有指定并发选项的标签。

有没有办法与 liquibase 同时创建索引?

【问题讨论】:

  • 你需要一个带有适当CREATE INDEX声明的<sql>标签
  • 我看到这个错误 CREATE INDEX CONCURRENTLY cannot run inside a transaction block。我假设迁移在事务中运行以在必要时回滚。是不是我做错了什么?
  • @user4988095 是的,每个变更集都在事务中执行

标签: indexing liquibase


【解决方案1】:

您可以将runInTransaction 指定为false 以同时创建索引。

【讨论】:

  • liquibase 文件是一个 sql 文件。在哪里指定?
  • 在 liquibase changeSet 中添加后可以完美运行
【解决方案2】:

创建并发索引必须使用任意sql change

<changeSet runInTransaction="false" id="10-add-widgets-kind-index" author="username">
    <sql dbms="postgresql">
        CREATE INDEX CONCURRENTLY
        IF NOT EXISTS idx_widgets_kind 
        ON widgets(kind)
    </sql>
</changeSet>

这是a_horse_with_no_name's commentTheDude's answer 的组合。

【讨论】:

    【解决方案3】:

    以前的答案可以完成这项工作。我想提供一个不直接回答 OP 问题的替代方案,但确实提供了一个具有相同最终结果和一些额外优势的解决方案。我觉得向像我一样偶然发现这个答案的人展示其他选择是件好事。

    要仅使用 Liquibase 创建索引,您需要使用 &lt;sql&gt; 标签。我警告不要这样做,因为如果您出于任何原因(开发、评估、测试等)使用不同的数据库,它可能会导致不良后果。 sql 语句将被跳过,您可能会认为索引已添加,而实际上并未添加。

    此外,假设您在生产系统上运行它而没有将其停机进行维护并且迁移是构建过程的一部分,这可能会导致迁移控制较少。

    我建议直接在 Postgres 上创建索引,并通常使用 Liquibase 和前置条件检查添加索引迁移。

    首先,手动添加索引:

    CREATE INDEX CONCURRENTLY widgets_kind_idx ON widgets (kind);
    

    然后添加到您的 Liquibase 变更集:

    <changeSet id="10-add-widgets-kind-index" author="username">
    
        <preConditions onFail="MARK_RAN">
            <not>
                <indexExists indexName="widgets_kind_idx" />
            </not>
        </preConditions>
    
        <createIndex tableName="widgets" indexName="widgets_kind_idx">
            <column name="kind" />
        </createIndex>
    
    </changeSet>
    

    这提供了以任何所需方式添加索引的能力,并使您的 Liquibase 迁移保持在已知状态。正在设置的新数据库不需要 CONCURRENTLY 关键字。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-17
      • 1970-01-01
      • 2017-08-24
      • 2016-07-24
      • 1970-01-01
      相关资源
      最近更新 更多