REINDEX { TABLE | DATABASE | INDEX } name [ FORCE ]
指定したテーブルの全インデックスを再作成します。
指定したデータベースの全てのシステムインデックスを再作成します。(ユーザテーブルのインデックスは含まれません。)
指定したインデックスを再作成します。
インデックスの再作成を行なうテーブル/データベース/インデックスの名前を指定します。
強制的にシステムインデックスの再構築を行ないます。このキーワードがなければ、REINDEX は無効とされていないシステムインデックスを処理しません。FORCE を REINDEX INDEX や ユーザインデックスに対する再作成に付与することは意味がありません。
REINDEX は、破損したシステムインデックスの修復に使われます。理論的にはこれは必要なものではありませんが、実際のところインデックスはソフトウェアのバグやハードウェア障害により破損することがあります。REINDEX はこの修復手段を提供します。
ユーザテーブルのインデックスが破損したかもしれない場合、 REINDEX INDEX もしくは REINDEX TABLE を使用して、そのインデックスやそのテーブル上の全てのインデックスを簡単に再作成することができます。
Note: ユーザテーブルの破損したインデックスを扱うもう一つの方法は、ただそのインデックスを破棄し、再作成することです。他のテーブルに対する操作と同じような操作で管理できますので、実際はこの方法の方が好まれるかもしれません。 REINDEX はテーブルの排他的ロックを獲得しますが、CREATE INDEX はテーブルへの書き込みのみをロックし、読み込みはロックしません。
システムテーブルのインデックスの破損を復旧する必要がある場合はより複雑になります。この場合、疑わしいインデックス自体を使用しないようにバックエンドに復旧処理を実行させることが重要です。(実際は、このような場合は、破損したインデックスへの依存によりバックエンドはその起動時に強制終了してしまうことになるでしょう。)安全に復旧させるには、postmaster を停止させ、-Oおよび-Pコマンドラインオプション(これらはそれぞれシステムテーブルの変更を許可し、システムインデックスの使用を抑制するオプションです。)を使用してスタンドアロン状態のPostgreSQL バックエンドを起動させなければなりません。そして、どこまで再構成させたいのかによって、REINDEX INDEX、REINDEX TABLE、または、REINDEX DATABASE コマンドを発行します。不明な場合は、REINDEX DATABASE FORCE を使用して、強制的にそのデータベースの全てのシステムインデックスを再構成して下さい。そして、スタンドアロン状態のバックエンドを停止させ、postmaster を再起動して下さい。
ほとんどのユーザにとって、スタンドアロン状態のバックエンドを使用する機会は上の場合のみですので、使用上の注意事項を以下に示します。
以下のようなコマンドでバックエンドを起動します。
postgres -D $PGDATA -O -P my_database
データベース領域の正確なパスを -D に指定、もしくは、環境変数PGDATA が設定されているか確認して下さい。また、作業対象とするデータベースの名前を指定して下さい。
REINDEX だけではなく、任意のSQLコマンドを発行することができます。
スタンドアロン状態のバックエンドでは、改行をコマンド入力の終りとして扱うことに注意して下さい。 psql におけるセミコロンのような高度な機能はありません。コマンドが複数行に渡る場合は、最終行を除き、改行を入力する前にバックスラッシュを入力しなければなりません。また、readline ライブラリの便利な機能は使用できません。(例えば、コマンド履歴機能はありません。)
バックエンドを終了させる方法は、EOF(通常は control-D) を入力することです。
より詳細については postgres のリファレンスページを参照して下さい。