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. 原因分析
这个是在读库上查询数据较久,而对应的数据在写库已出现变化,从而出现读写数据冲突了
(视图一般是联合多个基表查询,如未加筛选条件会更慢)
用一个例子来演示会更加清晰
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App