PostgreSQL 9.3サーバーがあり、元のディスクのスペースを解放したいため、別のディスクの別のテーブルスペースに移動したい大きなインデックスがあります。ただし、これは本番システムであり、インデックスは読み取りパフォーマンスを許容できるものにするのに役立つため、あるテーブルスペースから別のテーブルスペースに移動している間、インデックスをインデックスとして使用できるようにします。データの書き込みは問題ではなく、停止してデータベースを本質的に「読み取り専用データベース」にすることができます。
しかし、私はこれに関する情報をpostgresのドキュメントで見つけることができません。
ALTER INDEX
のPostgreSQL 9.3ドキュメントでは、ロックについて言及していません。
このフォームは、インデックスのテーブルスペースを指定されたテーブルスペースに変更し、インデックスに関連付けられたデータファイルを新しいテーブルスペースに移動します。 CREATE TABLESPACEも参照してください。
ALTER INDEX
のPostgreSQL 9.4ドキュメントでは、ロックについて言及していますが、どのロックについては言及しておらず、ALL IN TABLESPACE
フォームを参照する場合のみです。
このフォームは、インデックスのテーブルスペースを指定されたテーブルスペースに変更し、インデックスに関連付けられたデータファイルを新しいテーブルスペースに移動します。インデックスのテーブルスペースを変更するには、インデックスを所有し、新しいテーブルスペースに対するCREATE権限を持っている必要があります。テーブルスペースの現在のデータベースにあるすべてのインデックスは、ALL IN TABLESPACEフォームを使用して移動できます。これにより、移動するすべてのインデックスがロックされ、それぞれが移動します。このフォームはOWNED BYもサポートしています。OWNEDBYは、指定されたロールが所有するインデックスのみを移動します。 NOWAITオプションが指定されている場合、必要なすべてのロックをすぐに取得できないと、コマンドは失敗します。システムカタログはこのコマンドでは移動されないことに注意してください。必要に応じて、代わりにALTER DATABASEまたは明示的なALTER INDEX呼び出しを使用してください。 CREATE TABLESPACEも参照してください。
では、ALTER INDEX ... SET TABLESPACE ...
を実行しても、インデックスが移動されている間、インデックスから読み取ることはできますか?
インデックスを同時に再作成して、新しいインデックスの作成中に元のインデックスが使用されるようにします。
CREATE INDEX CONCURRENTLY idx_name
ON table_name
USING BTREE(col_name)
TABLESPACE new_tblspace