

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# pg\$1repack を使用した肥大化の削除
<a name="pg-repack"></a>

`pg_repack` 拡張機能を使用すると、データベースロックを最小限に抑えながらテーブルとインデックスの肥大化を削除できます。この拡張機能はデータベースインスタンスで作成し、Amazon Elastic Compute Cloud (Amazon EC2) またはデータベースに接続できるコンピュータからクライアントのバージョンが拡張機能のバージョンと一致する `pg_repack` クライアントを実行できます。

`VACUUM FULL` とは異なり、`pg_repack` はダウンタイムやメンテナンスの期間を必要とせず、他のセッションをブロックすることもありません。

`pg_repack` は、`VACUUM FULL`、`CLUSTER`、または `REINDEX` が機能しない状況で役に立ちます。肥大化したテーブルのデータを含む新しいテーブルを作成し、元のテーブルの変更を追跡して、元のテーブルを新しいテーブルに置き換えます。新しいテーブルの構築中は、元のテーブルに対する読み取りまたは書き込みオペレーションがロックされません。

完全なテーブルまたはインデックスに対して `pg_repack` を使用できます。タスクのリストを確認するには、[pg\$1repack のドキュメント](https://reorg.github.io/pg_repack/)を参照してください。

制限:
+ `pg_repack` を実行するには、テーブルにプライマリキーまたは一意のインデックスが必要です。
+ `pg_repack ` は一時テーブルでは機能しません。
+ `pg_repack` は、グローバルインデックスを使用するテーブルでは機能しません。
+ `pg_repack` が進行中の場合、テーブルに対して DDL オペレーションを実行することはできません。

以下の表では、`pg_repack` と `VACUUM FULL` の違いについて説明しています。


|  |  | 
| --- |--- |
| `VACUUM FULL` | `pg_repack` | 
| 組み込みコマンド | Amazon EC2 またはローカルコンピュータから実行する拡張機能 | 
| テーブルでの作業中に `ACCESS EXCLUSIVE` のロックが必要 | 短時間のみ `ACCESS EXCLUSIVE` のロックが必要 | 
| すべてのテーブルで動作 | プライマリキーと一意のキーのみを持つテーブルで動作 | 
| テーブルとインデックスで使用するストレージの 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\$1repack](https://aws.amazon.com/blogs/database/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;
```