

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 pg\_repack 移除膨脹
<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\_repack 文件](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`鎖定 | 
| 適用於所有資料表 | 僅適用於具有主索引鍵和唯一索引鍵的資料表 | 
| 需要資料表和索引所耗用的儲存體兩倍 | 需要資料表和索引所耗用的儲存體兩倍 | 

若要在資料表`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](https://aws.amazon.com/blogs/database/remove-bloat-from-amazon-aurora-and-rds-for-postgresql-with-pg_repack/)。

**警告**  
中的`error-on-invalid-index`錯誤`pg_repack`通常表示資料表上的一或多個索引損毀或無效。 `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;
```