使用 pg_repack 移除膨脹 - AWS 方案指引

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

使用 pg_repack 移除膨脹

您可以使用 pg_repack擴充功能,以最少的資料庫鎖定來移除資料表和索引膨脹。您可以在資料庫執行個體中建立此擴充功能,並從 Amazon Elastic Compute Cloud (Amazon EC2) 或從可連線至資料庫的電腦執行pg_repack用戶端 (其中用戶端版本符合擴充功能版本)。

與 不同VACUUM FULLpg_repack 不需要停機時間或維護時段,也不會封鎖其他工作階段。

pg_repackVACUUM FULLCLUSTERREINDEX可能無法運作的情況下很有幫助。它會建立新的資料表,其中包含膨脹資料表的資料、追蹤原始資料表的變更,然後將原始資料表取代為新的資料表。在建立新資料表時,它不會鎖定原始資料表以進行讀取或寫入操作。

您可以使用 pg_repack作為完整資料表或 作為索引。若要查看任務清單,請參閱 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

警告

中的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;