Home Explore Blog CI



postgresql

7th chunk of `doc/src/sgml/ref/reindex.sgml`
87fcc4c272e3c4c1f1f541e34296717baed9a7841751166500000001000008fc
 EXCLUSIVE</literal> session locks for the indexes and the table are
       released.
      </para>
     </listitem>
    </orderedlist>
   </para>

   <para>
    If a problem arises while rebuilding the indexes, such as a
    uniqueness violation in a unique index, the <command>REINDEX</command>
    command will fail but leave behind an <quote>invalid</quote> new index in addition to
    the pre-existing one. This index will be ignored for querying purposes
    because it might be incomplete; however it will still consume update
    overhead. The <application>psql</application> <command>\d</command> command will report
    such an index as <literal>INVALID</literal>:

<programlisting>
postgres=# \d tab
       Table "public.tab"
 Column |  Type   | Modifiers
--------+---------+-----------
 col    | integer |
Indexes:
    "idx" btree (col)
    "idx_ccnew" btree (col) INVALID
</programlisting>

    If the index marked <literal>INVALID</literal> is suffixed
    <literal>_ccnew</literal>, then it corresponds to the transient
    index created during the concurrent operation, and the recommended
    recovery method is to drop it using <literal>DROP INDEX</literal>,
    then attempt <command>REINDEX CONCURRENTLY</command> again.
    If the invalid index is instead suffixed <literal>_ccold</literal>,
    it corresponds to the original index which could not be dropped;
    the recommended recovery method is to just drop said index, since the
    rebuild proper has been successful.
    A nonzero number may be appended to the suffix of the invalid index
    names to keep them unique, like <literal>_ccnew1</literal>,
    <literal>_ccold2</literal>, etc.
   </para>

   <para>
    Regular index builds permit other regular index builds on the same table
    to occur simultaneously, but only one concurrent index build can occur on a
    table at a time. In both cases, no other types of schema modification on
    the table are allowed meanwhile.  Another difference is that a regular
    <command>REINDEX TABLE</command> or <command>REINDEX INDEX</command>
    command can be performed within a transaction block, but <command>REINDEX
    CONCURRENTLY</command> cannot.
   </para>

   <para>
    Like any long-running transaction, <command>REINDEX</command> on a table
    can affect

Title: Handling Invalid Indexes and Concurrency Restrictions
Summary
This section explains how to identify and recover from failed concurrent reindex operations by dropping invalid indexes (suffixed with `_ccnew` or `_ccold`). It also outlines the concurrency limitations of index builds: multiple regular index builds can occur simultaneously, but only one concurrent index build is allowed per table at a time, and no other schema modifications are permitted. Additionally, `REINDEX CONCURRENTLY` cannot be performed within a transaction block.