pgsql报错:User query might have needed to see row versions that must be removed.

 

 

pgsql只读实例执行sql语句报错:

ERROR: canceling statement due to conflict with recovery

User query might have needed to see row versions that must be removed.

 

google查了下问题,大概原因是:主节点的相关表做了DDL或者DML,wal在备节点回放的时候,备节点的查询还在进行,如此就会发生冲突,强制退出备节点查询的语句,报出以上错误。

 

解决办法大概有以下办法:

1、设置hot_standby_feedback = on

默认情况下,主数据库是看不到从数据库上的查询操作的,设置hot_standby_feedback为on,可以防止主数据库的vacuum操作把从数据库查询需要的数据行给清除掉。但是这个方案可能会影响主数据库的性能,因为主数据库现在得考虑从数据库的查询,势必会是一种负担,如在pg官方文档中写道:Well, the disadvantage of it is that the standby can bloat the master, which might be surprisi

2、设置max_standby_streaming_delay,这个值设置大一些。
pg中有一个max_standby_streaming_delay参数,意思是从数据库replay主数据库操作可以等待的最长时间。默认是30s,将其设置为一个相对比较大的数,或者-1,也就是可以无限等待,可以在所有查询完成之后再replay主数据库的操作,这样长查询就不会被取消了。这个参数相比hot_standby_feedback,只会影响从服务区,对主服务区没影响,但是有可能会加大主从数据不一致。

 

step1和step2各有优缺点,目前pgsql的主从这块没有完美的方案,就看哪种场景比较合适自己业务,就选用哪一种场景了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值