本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
透過清空回收儲存空間
PostgreSQL Multiversion 並行控制 (MVCC) 可透過儲存更新或刪除資料列的內部複本,直到交易遞交或復原為止,協助保持資料完整性。如果未定期清理,這些副本也稱為元組,可能會導致資料表膨脹。PostgreSQL 執行個體會依其交易 排序交易IDs,而 PostgreSQL 會使用交易 ID 型MVCC來控制管道可見性並提供交易隔離。每個交易都會建立資料的快照,而且每個元組都有一個版本。快照和版本都是以交易 ID 為基礎的。
若要清除資料,VACUUM
公用程式會在 Postgre 中執行四個關鍵函數SQL:
-
VACUUM
– 移除過期的資料列版本,讓空間可供重複使用。 -
VACUUM FULL
– 透過移除無效資料列版本並壓縮資料表、減少大小並提高效率,提供完整的重組。 -
VACUUM FREEZE
– 將較舊的資料列版本標記為凍結,以防止交易 ID 包裝問題。 -
VACUUM ANALYZE
– 移除無效資料列版本並更新資料庫的查詢規劃統計資料。這是VACUUM
和ANALYZE
函數的組合。如需如何在 Aurora PostgreSQL 無限制資料庫中ANALYZE
運作的詳細資訊,請參閱 ANALYZE。
如同 MVCC,Aurora PostgreSQL 中的清空是以交易 ID 為基礎。如果在清空開始時有進行中的交易,則不會移除該交易仍然可見的資料列。
如需 VACUUM
公用程式的詳細資訊,請參閱 PostgreSQL 文件VACUUMVACUUM
支援的詳細資訊,請參閱VACUUM。
主題
AUTOVACUUM
Aurora PostgreSQL 使用 VACUUM
和 AUTOVACUUM
公用程式來移除不需要的元組。AUTOVACUUM
和 手動的基礎機制VACUUM
相同;唯一的不同在於自動化。
AUTOVACUUM
在 Aurora PostgreSQL 和 Aurora PostgreSQL 無限制資料庫中, 是 VACUUM
和 ANALYZE
公用程式的組合。 會根據預先定義的規則,AUTOVACUUM
決定要清除哪些資料庫和資料表,例如無效元組的百分比和插入數。
例如,AUTOVACUUM
「定期喚醒」以執行清除。間隔由 autovacuum_naptime
參數控制。預設值為 1 分鐘。Aurora PostgreSQL 無限制資料庫的 AUTOVACUUM
和 VACUUM
組態參數預設值與 Aurora Postgre 相同SQL。
AUTOVACUUM
協助程式如果啟用,則每當資料表的內容發生充分變更時, 就會自動發出ANALYZE
命令。在 Aurora PostgreSQL 無限資料庫中,路由器和碎片ANALYZE
都會AUTOVACUUM
發生問題。
如需與 AUTOVACUUM
相關聯的協助程式和資料表儲存參數的詳細資訊AUTOVACUUM
,請參閱 PostgreSQL 文件中的自動清空協助程式
Aurora PostgreSQL 無限資料庫中以時間為基礎的清空
Aurora PostgreSQL 無限資料庫是分散式系統,這表示交易中可以涉及多個執行個體。因此,交易 ID 型可見性不適用。反之,Aurora PostgreSQL 無限制資料庫使用以時間為基礎的可見性,因為跨執行個體的交易IDs不會「統一」,但跨執行個體的時間可以「統一」。每個交易快照和每個元組版本都遵守時間,而不是交易 ID。更具體而言,交易快照具有快照開始時間,而元組具有建立時間 (當 INSERT
或 UPDATE
發生時) 和刪除時間 (當 DELETE
發生時)。
為了維持資料庫碎片群組中執行個體的資料一致性,Aurora PostgreSQL 無限資料庫必須確保清空不會移除資料庫碎片群組中任何作用中交易仍然可見的任何元組。因此,在 Aurora PostgreSQL 無限制資料庫中進行清空也是以時間為基礎的。的其他方面VACUUM
保持不變,包括在特定資料表VACUUM
上執行的方面,使用者必須能夠存取該資料表。
注意
我們強烈建議您不要讓交易長時間開啟。
時間型清空比交易 ID 型清空耗用更多記憶體。
下列範例說明以時間為基礎的清空的運作方式。
-
客戶資料表分佈在四個碎片中。
-
交易 1 以可重複讀取開頭,並僅鎖定一個碎片 (碎片 1)。此交易保持開啟狀態。
交易 1 比之後啟動的任何其他交易舊。
-
交易 2 稍後開始,並從資料表中刪除所有元組,然後遞交。
-
如果
VACUUM
AUTOVACUUM
或 手動嘗試清除無效元組 (因交易 2 而失效),則不會移除任何項目。這不僅適用於碎片 1,也適用於碎片 2–4,因為交易 1 仍可能需要存取這些元組。由於 ,交易 1 仍然可以看到它們MVCC。
最後一個步驟是透過同步來達成,因此即使交易 1 未碰觸到所有碎片,所有碎片都知道交易 1。
使用資料庫統計資料進行清空
若要取得您可能需要清除的元組資訊,請使用 limitless_stat_all_tables 檢視,其運作方式類似於 pg_stat_all_tables
SELECT * FROM rds_aurora.limitless_stat_all_tables WHERE relname LIKE '%customer%';
同樣地,對於資料庫統計資料,請使用 limitless_stat_database 而非 pg_stat_database
若要檢查資料表磁碟用量,請使用 limitless_stat_relation_sizes 函數,其運作方式類似於 pg_relation_size
SELECT * FROM rds_aurora.limitless_stat_relation_sizes('public','customer');
若要追蹤 Aurora PostgreSQL 無限制資料庫上的VACUUM
操作進度,請使用 limitless_stat_progress_vacuum 檢視,而非 pg_stat_progress_vacuum
SELECT * FROM rds_aurora.limitless_stat_progress_vacuum;
如需詳細資訊,請參閱 Aurora PostgreSQL 無限資料庫檢視 和 Aurora PostgreSQL 無限資料庫函數。
Aurora PostgreSQL 和 Aurora PostgreSQL 無限資料庫之間清空行為的差異
Aurora PostgreSQL 和 Aurora PostgreSQL 無限資料庫在清空運作方式上的一些其他差異如下:
-
Aurora PostgreSQL 會對交易執行
VACUUM
操作,IDs直到最舊的持續交易為止。如果資料庫中沒有持續的交易, 會VACUUM
執行操作,直到上次交易為止。 -
Aurora PostgreSQL 無限資料庫每 10 秒同步一次最舊的時間快照。因此,
VACUUM
可能不會對過去 10 秒內執行的任何交易執行 操作。
如需在 VACUUM
Aurora PostgreSQL 無限資料庫中支援 的資訊,請參閱 VACUUM 中的 Aurora PostgreSQL 無限資料庫參考。