當查詢 Amazon RDS for PostgreSQL 資料庫執行個體的讀取複本時,如何針對「canceling statement due to conflict with recovery」(因與復原衝突而取消陳述式) 錯誤進行疑難排解?

1 分的閱讀內容
0

我為我的 Amazon Relational Database Service (Amazon RDS) for PostgreSQL 執行個體設置了讀取複本。當我查詢讀取複本時,我收到「canceling statement due to conflict with recovery」(因與復原衝突而取消陳述式) 錯誤。

解決方法

如果主要執行個體和讀取複本之間存在複製衝突,則您會收到 cancelling statement (取消陳述式) 錯誤。PostgreSQL 無法將 WAL 資訊套用到讀取複本上,因為變更可能會封鎖在讀取複本上發生的活動。例如,當 SELECT 陳述式在讀取複本中的已刪除表格上執行時,您可以在主要執行個體上執行 DROP 陳述式。如果讀取複本套用 WAL 記錄並取消 SELECT 陳述式,則您會收到 cancelling statement (取消陳述式) 錯誤。

若要解決 canceling statement (取消陳述式) 錯誤,請根據錯誤訊息的詳細資訊在讀取複本上設定自訂參數。

您也可以在讀取複本上使用 pg_stat_database_conflicts 檢視,查看因與復原衝突而取消的陳述式統計資料。如需詳細資訊,請參閱 PostgreSQL 網站上的27.2.18 pg_stat_database_conflicts

錯誤訊息詳細資訊: 「使用者保留關係鎖定太長時間」

若要解決此問題,請變更 max_standby_streaming_delaymax_standby_archive_delay 參數,以在讀取複本取消衝突的待命陳述式之前留出更多時間。如果讀取複本讀取串流複寫中的 WAL 資料,則修改 max_standby_streaming_delay 參數。如果讀取複本從 Amazon Simple Storage Service (Amazon S3) 中的封存位置讀取 WAL 資料,則修改 max_standby_archive_delay 參數。

如需有關這些參數的詳細資訊,請參閱 PostgreSQL 網站上的 max_standby_streaming_delay (整數)max_standby_archive_delay (整數)

如果將參數值設為 0,則讀取複本會取消衝突的查詢,並將 WAL 項目套用到複本執行個體上。如果將該值設為 -1,則允許複本執行個體永遠等待衝突查詢,這樣會導致複製延遲增加。根據您的使用案例調整這些參數的值,以平衡查詢取消或複製延遲。

**注意:**如果您增加 最max_standby_archive_delay 以保留與讀取 WAL 封存項目衝突的查詢,那麼最好的做法是同時增加 max_standby_streaming_delay,以防止查詢取消。

錯誤訊息詳細資訊: 「使用者查詢可能需要查看必須移除的資料列版本」

此問題通常發生在讀取複本上的交易正在讀取主要執行個體上設定為刪除的元組時。要解決此問題,您可能需要啟動 hot_standby_feedback 參數。

當您啟用 hot_standby_feedback 時,讀取複本會向主要執行個體傳送意見反應訊息,其中包含有關最早活動交易的資訊。因此,主要執行個體不會移除交易可能需要的記錄。如需有關此參數的詳細資訊,請參閱 PostgreSQL 網站上的 hot_standby_feedback (布林值)

重要: 預設情況下,hot_standby_feedback 參數預設為停用。當您在讀取複本上啟用 hot_standby_feedback 時,在讀取複本上執行長時間執行的查詢可能會導致主要執行個體表膨脹。Vacuum 作業不會移除長時間執行查詢可能需要的死元組 (膨脹)。為了降低腫脹的風險,最好的做法是同時降低 autovacuum_thresholdautovacuum_vacuum_scale_factor,並增加 autovacuum_cost_limit