無効なインデックスの再構築

1.8M の投稿を持つサイトを 2.7.0.beta2 へ、またそれに伴い PG10 から PG13 へアップグレードしました。beta3 が「データベースマイグレーションのパフォーマンス向上」を備えてリリースされたため、すぐに再度アップグレードを行いました。

reindex concurrently を実行しようとすると、以下のエラーが発生します。

WARNING:  cannot reindex invalid index "public.allowed_pm_users_pkey_ccnew" concurrently, skipping
WARNING:  cannot reindex invalid index "public.index_allowed_pm_users_on_user_id_and_allowed_pm_user_id_ccnew" concurrently, skipping
WARNING:  cannot reindex invalid index "public.index_allowed_pm_users_on_allowed_pm_user_id_and_user_id_ccnew" concurrently, skipping

これらのインデックスをドロップして再作成しようかと思いましたが、現在のソースコードには ccnew という文字列が見当たらないため、どう対処すべきか分かりません。

こちらをご覧いただくと、_ccnew インデックスが並行再インデックスの実行メカニズムの一部であることがわかります:

  • カタログに、再インデックス対象のインデックスのコピーとなる新しいインデックスを作成します(いくつかの例外を除きます。例えば、パーティションインデックスは作成時に継承依存関係を登録せず、スワップ時に登録します)。この新しい一時的なインデックスには「_ccnew」というサフィックスが付きます。

これらのインデックスを concurrently キーワードなしで再インデックスすることは可能でしょうか?

あるいは、その投稿の後半には以下のようにも書かれています:

その後、REINDEX TABLE CONCURRENTLY は無効なインデックスをスキップします。連続して複数の失敗が発生した場合、インデックスの数が単純に増え続け、実行ごとに倍増してしまい、後続の再インデックス操作で膨大な肥大化を引き起こすためです:

ただし、REINDEX INDEX CONCURRENTLY だけで無効なインデックスを再インデックスすることは可能です:

_ccnew は、以前の reindex concurrently で作成が試みられたが、通常は一意性チェックに抵触したために作成できなかったインデックスです。reindex concurrently の失敗による試行結果はここに残留するため、手動で削除する必要があります。

2 回目に reindex concurrently を実行すると、PostgreSQL はそれらの失敗による残存物をスキップします。

ラファエル、ありがとう!それで解決しました。そのインデックスを drop して、問題なく並行再インデックスを実行しました。