在 Amazon RDS for PostgreSQL 上使用 PostgreSQL 自動清空 PostgreSQL - Amazon Relational Database Service

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

在 Amazon RDS for PostgreSQL 上使用 PostgreSQL 自動清空 PostgreSQL

強烈建議您使用自動資料清理功能,以維護 PostgreSQL 資料庫執行個體的運作狀態。自動資料清理會自動啟動 VACUUM 和 ANALYZE 指令。此功能會檢查含有大量輸入、更新或刪除元組的資料表。完成檢查後,即會透過從 PostgreSQL 資料庫移除已淘汰的資料或元組回收儲存空間。

根據預設,系統會為您使用任何預設 PostgreSQL 資料庫參數群組建立的 RDS for 資料庫執行個體開啟自動清空。 PostgreSQL 預設情況下,還會設定與自動資料清理功能相關聯的其他組態參數。因為這些預設值相當泛用,針對特定的工作負載調校與自動資料清理功能相關聯的某些參數,對您會有所幫助。

您可以在下面找到有關自動清空以及如何在 RDS for PostgreSQL 資料庫執行個體上調整其部分參數的詳細資訊。如需高階資訊,請參閱 使用 PostgreSQL 的最佳實務

配置自動資料清理的記憶體

autovacuum_work_mem 參數是影響自動資料清理效能的最重要參數之一。在 RDS for PostgreSQL 第 14 版及之前版本中, autovacuum_work_mem 參數設定為 -1,表示改maintenance_work_mem用 的設定。對於所有其他版本, autovacuum_work_mem 是由 GREATEST({DBInstanceClassMemory/32768}, 65536) 決定。

手動清空操作一律使用 maintenance_work_mem設定,預設設定為 GREATEST ({DBInstanceClassMemory/63963136*1024}, 65536),也可以使用 SET命令在工作階段層級進行調整,以進行更精準的手動VACUUM操作。

autovacuum_work_mem 會決定自動清空的記憶體,以保留無效元組 (pg_stat_all_tables.n_dead_tup) 的識別符來清空索引。

執行計算以判斷autovacuum_work_mem參數的值時,請注意下列事項:

  • 如果您將 參數設定為過低,清空程序可能需要掃描資料表多次才能完成其工作。多次的掃描可能會對效能產生負面影響。對於較大的執行個體,將 maintenance_work_memautovacuum_work_mem設定為至少 1 GB 可以改善清空具有大量無效元組資料表的效能。不過,在 PostgreSQL 第 16 版和之前版本中,清空的記憶體用量上限為 1 GB,這足以在單次傳遞中處理大約 1.79 億個無效元組。如果資料表的無效元組多於此值,則清空將需要多次通過資料表的索引,大幅增加所需的時間。從 PostgreSQL 第 17 版開始,沒有 1 GB 的限制,而自動清空可以透過使用弧度樹來處理超過 1.79 億個元組。

    元組識別符的大小為 6 個位元組。若要預估清空資料表索引所需的記憶體,請查詢 pg_stat_all_tables.n_dead_tup 尋找無效元組的數量,然後將此數字乘以 6,以判斷在單次傳遞中清空索引所需的記憶體。您可以使用下列查詢:

    SELECT relname AS table_name, n_dead_tup, pg_size_pretty(n_dead_tup * 6) AS estimated_memory FROM pg_stat_all_tables WHERE relname = 'name_of_the_table';
  • autovacuum_work_mem 參數會搭配 autovacuum_max_workers 參數運作。中的每個工作者autovacuum_max_workers都可以使用您配置的記憶體。如果您有許多小型資料表,請配置較多 autovacuum_max_workers 和較少 autovacuum_work_mem。如果您有大型資料表 (大於 100 GB),請配置更多記憶體和更少的工作者程序。您必須配置足夠的記憶體,才能在最大的資料表上順利執行作業。因此,請確定工作者程序和記憶體的組合等於您要配置的總記憶體。

降低交易 ID 包圍的可能性

在一些狀況中,自動資料清理相關的參數群組設定可能不夠積極以防止交易 ID 包圍。為了解決此問題,RDS for PostgreSQL 提供自動調整自動清空參數值的機制。自適應自動清空RDS for PostgreSQL 的一項功能。PostgreSQL 文件中有詳細的 交易 ID 包圍 的說明。

RDS for PostgreSQL 執行個體的自適應自動清空預設為開啟,動態參數rds.adaptive_autovacuum設定為 ON。我們強烈建議您開啟此選項。不過,若要關閉參數彈性調校功能,請將參數 rds.adaptive_autovacuum 設定為 0 或 OFF (關閉)。

即使 Amazon RDS AuroraAmazon RDS 調校自動清空參數,交易 ID 包圍仍然可行。我們鼓勵您實施交易 ID 包圍的Amazon CloudWatch 警報。如需詳細資訊,請參閱 AWS 資料庫部落格上的文章在 RDS for PostgreSQL 中實作交易 ID 包裝的提早警告系統

若開啟自動資料清理參數彈性調校,當 CloudWatch 指標 MaximumUsedTransactionIDs 達到 autovacuum_freeze_max_age 參數的值或 500,000,000 時 (以較大者為準),Amazon RDS 將開始調整自動資料清理參數。

如果資料表繼續有交易 ID 包圍的趨勢,則 Amazon RDS 會繼續調整自動資料清理的參數。每次調整都提供更多自動資料清理的資源以避免包圍。Amazon RDS 會更新下列自動資料清理相關參數:

RDS 只會在新的值能夠使自動資料清理更為積極時修改這些參數。參數在資料庫執行個體上的記憶體中修改。參數群組中的值不會變更。若要檢視目前的使用中記憶體設定,請使用 PostgreSQL SHOW (顯示) SQL 指令。

當 Amazon RDS 修改任何自動資料清理參數時,即會對受影響的資料庫執行個體產生事件。此事件會顯示在 上, AWS Management Console 並透過 Amazon RDS API 顯示。MaximumUsedTransactionIDs CloudWatch 指標回到閥值以下時,Amazon RDS 就會將記憶體中的自動資料清理參數重設回參數群組中指定的值。系統隨即會產生與此變更相對應的另一個事件。