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. 原因分析

这个是在读库上查询数据较久,而对应的数据在写库已出现变化,从而出现读写数据冲突了

(视图一般是联合多个基表查询,如未加筛选条件会更慢)

posted @ 2021-12-14 10:08  littlevigra  阅读(1929)  评论(5编辑  收藏  举报