我想對在執行 AWS Database Migration Service (AWS DMS) 變更資料擷取 (CDC) 任務時,來源 PostgreSQL 資料庫儲存空間使用量過高的問題進行疑難排解。
簡短說明
當您將 PostgreSQL 作為 CDC 任務的來源時,AWS DMS 會使用 PostgreSQL 的邏輯複寫插槽來擷取來源資料庫的變更。這些複寫插槽會保留 AWS DMS 所需的預先寫入日誌 (WAL),即使您未將 WAL 連線到 PostgreSQL 來源。AWS DMS 只有在從複寫插槽擷取所需變更並推進該複寫插槽的 restart_lsn 後,才會從 PostgreSQL 中移除 WAL。
如需更多資訊,請參閱 PostgreSQL 網站上的邏輯解碼概念。
儲存磁碟空間問題可能發生的原因如下:
- 您長時間停止 AWS DMS CDC 任務。如果您未將 AWS DMS 連線到來源資料庫,它就不會從來源的複寫插槽消耗變更。因此,PostgreSQL 會持續保留 WAL。
- 您的工作負載過重,導致過度生成 WAL。使用邏輯複寫插槽時,如果複寫插槽需要日誌序號 (LSN),PostgreSQL 將保留 WAL。
- 存在閒置的複寫插槽。即使複寫插槽處於非作用狀態,該複寫插槽保留的 WAL 仍包含資料表、結構或資料庫的資訊。即使資料表沒有任何交易,也會佔用來源端的儲存空間。
解決方法
檢查複寫插槽是否導致 PostgreSQL 來源磁碟空間使用率過高
若要檢查複寫插槽是否導致 PostgreSQL 資料庫磁碟空間使用率過高,請執行以下查詢之一:
PostgreSQL v9:
psql=> SELECT slot_name, pg_size_pretty(pg_xlog_location_diff(pg_current_xlog_location(),restart_lsn)) AS replicationSlotLag, active FROM pg_replication_slots ;
PostgreSQL v10 及更新版本:
psql=> SELECT slot_name, pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(),restart_lsn)) AS replicationSlotLag, active FROM pg_replication_slots ;
輸出範例:
slot_name | replicationslotlag | active---------------------------------------------------------------+--------------------+--------
xc36ujql35djp_00013322_907c1e0a_9f8b_4c13_89ea_ef0ea1cf143d | 129 GB | f
7pajuy7htthd7sqn_00013322_a27bcebf_7d0f_4124_b336_92d0fb9f5130 | 704 MB | t
zp2tkfo4ejw3dtlw_00013322_03e77862_689d_41c5_99ba_021c8a3f851a | 624 MB | t
如果複寫插槽的作用中狀態設為 f (false),那麼您的資料庫不會使用該插槽。
若要刪除未使用的插槽,請執行以下查詢:
psql=> SELECT pg_drop_replication_slot('YOUR_SLOTNAME');
**注意:**將 YOUR_SLOTNAME 替換為插槽名稱。
如需更多資訊,請參閱 為什麼我會在 Amazon Relational Database Service (Amazon RDS) for PostgreSQL 遇到「No space left on device」或「DiskFull」錯誤?
啟用 WAL 心跳功能
若要減少 PostgreSQL 來源資料庫的儲存空間使用量,請啟用 heartbeatEnable 額外連線屬性 (ECA)。此屬性能幫助防止 PostgreSQL 來源出現儲存空間已滿的情況。
若要啟用 WAL 心跳功能,請將以下 ECA 新增至 PostgreSQL 來源端點:
heartbeatEnable=Y;
**注意:**心跳交易僅在 AWS DMS 任務正在執行時,才會在來源資料庫上執行。如果您停止 AWS DMS 任務,則 WAL 心跳功能將不會生效。
您也可以指定以下 ECA:
heartbeatFrequency=frequency;heartbeatSchema=schemaname;
heartbeatFrequency 屬性決定了心跳交易在 PostgreSQL 來源上執行的頻率 (以分鐘為單位)。將 frequency 替換為您希望交易執行的頻率。例如,如果將 heartbeatFrequency 設為 15,則 AWS DMS 會每 15 分鐘在來源執行一次心跳交易。
heartbeatSchema 屬性指定 AWS DMS 建立資料庫物件以生成心跳交易的資料庫結構描述。將 schemaname 替換為您的資料庫結構描述。
設定 PostgreSQL 中插槽的最大大小
您可以在 PostgreSQL 13 及更新版本的來源資料庫上套用 max_slot_wal_keep_size。這會設定複寫插槽可以保留的 WAL 最大數量。如需更多資訊,請參閱 PostgreSQL 網站上的 max_slot_wal_keep_size。
**注意:**max_slot_wal_keep_size 設定可幫助您避免 PostgreSQL 來源的儲存空間已滿問題。但這可能會導致 PostgreSQL 來源資料庫在 AWS DMS CDC 任務從複寫插槽讀取變更之前,就清除 WAL。這可能會造成任務失敗。
相關資訊
Hevo 網站上的 PostgreSQL 複寫插槽類型