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

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

Amazon RDS for 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 設定為 [開啟]。我們強烈建議您開啟此選項。不過,若要關閉參數彈性調校功能,請將參數 rds.adaptive_autovacuum 設定為 0 或 OFF (關閉)。

Amazon 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 管理主控台 並透過 Amazon RDS API 顯示。MaximumUsedTransactionIDs CloudWatch 指標回到閥值以下時,Amazon RDS 就會將記憶體中的自動資料清理參數重設回參數群組中指定的值。系統隨即會產生與此變更相對應的另一個事件。