pg_repack を使用した肥大化の削除
pg_repack 拡張機能を使用すると、データベースロックを最小限に抑えながらテーブルとインデックスの肥大化を削除できます。この拡張機能はデータベースインスタンスで作成し、Amazon Elastic Compute Cloud (Amazon EC2) またはデータベースに接続できるコンピュータからクライアントのバージョンが拡張機能のバージョンと一致する pg_repack クライアントを実行できます。
VACUUM FULL とは異なり、pg_repack はダウンタイムやメンテナンスの期間を必要とせず、他のセッションをブロックすることもありません。
pg_repack は、VACUUM FULL、CLUSTER、または REINDEX が機能しない状況で役に立ちます。肥大化したテーブルのデータを含む新しいテーブルを作成し、元のテーブルの変更を追跡して、元のテーブルを新しいテーブルに置き換えます。新しいテーブルの構築中は、元のテーブルに対する読み取りまたは書き込みオペレーションがロックされません。
完全なテーブルまたはインデックスに対して pg_repack を使用できます。タスクのリストを確認するには、pg_repack のドキュメント
制限:
-
pg_repackを実行するには、テーブルにプライマリキーまたは一意のインデックスが必要です。 -
pg_repackは一時テーブルでは機能しません。 -
pg_repackは、グローバルインデックスを使用するテーブルでは機能しません。 -
pg_repackが進行中の場合、テーブルに対して DDL オペレーションを実行することはできません。
以下の表では、pg_repack と VACUUM FULL の違いについて説明しています。
|
|
組み込みコマンド |
Amazon EC2 またはローカルコンピュータから実行する拡張機能 |
テーブルでの作業中に |
短時間のみ |
すべてのテーブルで動作 |
プライマリキーと一意のキーのみを持つテーブルで動作 |
テーブルとインデックスで使用するストレージの 2 倍が必要 |
テーブルとインデックスで使用するストレージの 2 倍が必要 |
テーブルで pg_repack を実行するには、次のコマンドを使用します。
pg_repack -h <host> -d <dbname> --table <tablename> -k
インデックスで pg_repack を実行するには、次のコマンドを使用します。
pg_repack -h <host> -d <dbname> --index <index name>
詳細については、AWS のブログ記事「Remove bloat from Amazon Aurora and RDS for PostgreSQL with pg_repack
注意
pg_repack の error-on-invalid-index エラーは通常、テーブル上の 1 つ以上のインデックスが破損しているか無効であることを意味します。pg_repack は再パック処理中、データ整合性のためにインデックスに依存するため、無効なインデックスを持つテーブルでは安全に動作できません。
このエラーは、次の場合に発生します。
インデックスが無効としてマークされている場合 (例えば、
CREATE INDEX CONCURRENTLYステートメントが失敗したため)。インデックスが破損している場合 (ハードウェアの問題や突然のシャットダウンが原因の可能性があります)。
次のクエリを使用して無効なインデックスを特定し、見つかった場合は最初に削除します。
SELECT indexrelid::regclass, indisvalid FROM pg_index WHERE indrelid = 'orders'::regclass AND NOT indisvalid; Drop the invalid index: DROP INDEX index_name;