postgresql 主從 ERROR: canceling statement due to conflict with recovery User query might have needed to see row versions that must be removed.


0. 原理很簡單,就是主節點的相關表做了DDL或者DML,wal在備節點回放的時候,備節點的查詢還在進行,如此就會發生沖突,干掉備節點查詢的語句,報出以上錯誤。

下圖簡單演示了報錯原理,這里是由DML中的UPDATE引起的沖突,行版本不一致造成相關的錯誤。

 

 參考:(16條消息) Postgresql 查詢報錯ERROR: canceling statement due to conflict with recovery_魂醉的一畝二分地-CSDN博客

1. ERROR:  canceling statement due to conflict with recovery   User query might have needed to see row versions that must be removed.

2. 參考方案:

備庫上需要開啟的參數:
max_standby_streaming_delay = 10s

hot_standby_feedback = on  # 主要是這個參數設置為on即可

參考: PG從庫查詢被終止的解決辦法 (icode9.com)   https://www.icode9.com/content-4-514325.html

 

3. 最佳實踐

1.改大 比如:max_standby_streaming_delay = 30min; 
后果是wal空間變大,需監控磁盤空間;
2.不建議 改hot_standby_feedback=on;
 這個讀庫有問題會蔓延至寫庫;
3. 最好是能把對應的sql語句調優至比較短時間內執行完畢;

4. 原因分析

這個是在讀庫上查詢數據較久,而對應的數據在寫庫已出現變化,從而出現讀寫數據沖突了

(視圖一般是聯合多個基表查詢,如未加篩選條件會更慢)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM