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. 原因分析
這個是在讀庫上查詢數據較久,而對應的數據在寫庫已出現變化,從而出現讀寫數據沖突了
(視圖一般是聯合多個基表查詢,如未加篩選條件會更慢)