ERROR: canceling statement due to conflict with recovery
ERROR: canceling statement due to conflict with recovery
报错现象
ERROR: canceling statement due to conflict with recovery
DETAIL: User query might have needed to see row versions that must be removed.
业务重现
- 系统采用postgresql主备库数据库架构,主库用在微信小程序主要用在业务中产生的数据写入
- 从库采用流复制的方式从主库不断更新备库的数据,备库所服务的应用是后台的查询统计web应用
- 当在后台查询统计的时候,查询的是慢SQL,且查询用到的表正在更新数据的话,再查询时间较长的时候就会爆出上面的错误
问题原因
在主库上执行长时间查询过程中,由于此查询涉及的记录有可能在主库上被更新或删除,根据 PostgreSQL的mvcc机制,更新或删除的数据不是立即从物理块上删除,而是之后autovacuum进程对老版本数据进行 VACUUM,主库上对更新或删除数据的老版本进行 VACUUM后,从库上也会执行这个操作,从而与从库当前查询产生冲突,导致查询被中断并抛出以上错误。
解决方法
从业务层面上
从业务上可以优化慢SQL,数据表是不是太大了,是否需要分库分表,经常对更新频繁的表表分析和真空等。或者分时段查询,避免高峰段数据更新的时刻等
从数据库层面
修改maxstandby_ streaming_delay参数
此参数默认为30秒,当备库执行SQL时,有可能与正在应用的WAL发生冲突,此查询如果30秒没有执行完成则被中止,注意30秒不是备库上单个查询允许的最大执行时间,是指当备库上应用WAL时允许的最大WAL延迟应用时间,因此备库上查询的执行时间有可能不到这个参数设置的值就被中止了,此参数可以设置成-1,表示当从库上的WAL应用进程与从库上执行的查询冲突时,WAL应用进程一直等待直到从库查询执行完成。(我处理的时候是设置一个较大的值120,虽然偶尔还会报错,但是报错频率会少很多,建议后台处理的时候可以捕获这个异常,提示给查询用户,当前查询正忙请稍后再试)
修改hotstandby_feedback参数
默认情况下从库执行查询时并不会通知主库,设置此参数为on后从库执行查询时会通知主库,当从库执行查询过程中,主库不会清理从库需要的数据行老版本,因此,从库上的查询不会被中止,然而,这种方法也会带来一定的弊端,主库上的表可能出现膨胀,主库表的膨胀程度与表上的写事务和从库执行时间有关,此参数默认为off。(这种方式有风险,我没有测试过)
修改参数配置后需要重新加载一下数据库的配置文件
ERROR: canceling statement due to conflict with recovery相关推荐
- Canceling statement due to conflict with reco
目录 环境 症状 问题原因 解决方案 环境 系统平台:Linux x86-64 Red Hat Enterprise Linux 7,Linux x86-64 Red Hat Enterprise L ...
- 报错解决:error: this statement may fall through [-Werror=implicit-fallthrough=]
下午在编译 grpc时报错如下: utilities/blob_db/blob_log_reader.cc:74:18: error: this statement may fall through ...
- moviepy报错之 .This error can be due to the fact that ImageMagick is not installed on your computer(亲测)
说明: 今天安装moviepy这个模块一直用不了,结果突然测试说是缺少ImageMagick. 刚MoviePy入门跑第一个代码,就一直弄不了,后来发现还是环境没有配置好,下午就遇见了,一直没有解决, ...
- Go全局变量syntax error: non-declaration statement outside function bodygo
BUG syntax error: non-declaration statement outside function bodygo 原因 短写法必须用在方法内 不是全局变量 方法 使用var ...
- mybatis:Error preparing statement. Cause: java.lang.NullPointerException
mybatis使用中sql正常却出现空指针 org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibat ...
- mybatis数组越界异常 Error preparing statement
mybatis数组越界异常 今天在做数据库迁移时遇到这个问题:Error preparing statement. Cause: java.lang.ArrayIndexOutOfBoundsExce ...
- nginx报错:src/core/ngx_murmurhash.c:39:11: error: this statement may fall through [-Werror=implicit-fa
报错: make -f objs/Makefile install make[1]: Entering directory '/usr/local/nginx/nginx-1.7.7' cc -c - ...
- error: non-ASM statement in naked function is not supported
新建工程时出现以下错误: error: non-ASM statement in naked function is not supported error: parameter references ...
- node.js报错“Error: EPERM: operation not permitted, stat ‘C:\Recovery‘“
异常 node:internal/fs/utils:344throw err;^Error: EPERM: operation not permitted, stat 'C:\Recovery'at ...
- Error:Error: commons-logging defines classes that conflict with classes now provided by Android. Sol
转载自:http://www.voidcn.com/article/p-nsonoste-bth.html java – 在Android Studio 3.0 RC2中编译发布版本时出错 Error ...
最新文章
- springboot 访问httpclient接口
- cvBlob 作为静态库链接问题
- 人工智能产品化的关键是基础架构和数据,而非算法
- 修改计算机用户权限,如何修改一个电脑账户为最低权限
- 运维在浏览器搜索linux日志,Graylog日志管理系统---搜索查询方法使用简介
- python多窗口传递信息,认识QT ----- 多窗口以及窗口之间的传值
- 五 C# 多线程研究 使用Mutex类来同步方法及其与Monitor类和Lock之间的区别
- 电信校园网宽带创翼破解,路由器PPPOE拦截法
- opencv:图像的读取和显示
- VS配置永久OpenCV(小萌轻松操作):超细致
- 基于高光谱影像的农作物检测应用简介
- web项目查询mysql中文显示为问号_MySQL 表中的中文显示为问号
- Kotlin扩展方法进化之Context Receiver
- Java编程思想读书笔记——初始化与清理(二)
- 打飞机游戏 js 实现
- 创新发展,科技制胜 | 云扩科技入选“2022中小企业智能化解决方案提供商TOP10”
- 【NRF51822】百度手环开源源码分析--框架部分
- H5实现扫码读取二维码条形码功能(二维码+条形码)
- jdk_8u201_x64下载直链
- 电信 IPRAN 设备组网方案_中国电信首次确认5G独立组网(SA)时间表
热门文章
- 淘宝Fourinone介绍及与Hadoop的性能PK
- Python模拟登陆古诗文网手动输入验证码显示验证码错误
- pyodbc mysql_pyodbc and mySQL
- 遍历出List<Map>的Key / Value
- Android 关于ApplicationInfo flags快速了解
- 其实 Gradle Transform 就是个纸老虎 —— Gradle 系列(4)
- 关于MUI一个很实用的前端框架
- PAT甲级 1097
- python人脸识别plc_实例详解Python人脸识别
- Flutter 图片透明度(光暗程度)