PostgreSQL错误:由于与恢复冲突而取消声明
在待机模式下在PostgreSQL数据库上运行查询时出现以下错误。 导致错误的查询可以正常工作1个月,但如果查询超过1个月,则会导致错误。
ERROR: canceling statement due to conflict with recovery Detail: User query might have needed to see row versions that must be removed
任何build议如何解决? 谢谢
在热备份服务器上运行查询有点棘手 – 可能会失败,因为在查询某些需要的行时可能会更新或删除主服务器。 由于主要不知道查询是从第二个开始,它认为它可以清理(真空)其行的旧版本。 然后二级必须重播这个清理,并强制取消所有可以使用这些行的查询。
更长的查询将被更频繁地取消。
你可以通过启动一个可重复的读取事务来处理这个事情,这个事务在做一个虚拟查询,然后在一个真正的查询在辅助上运行的时候处于空闲状态。 它的存在将防止初级老版本的清空。
有关此主题和其他解决方法的更多信息,请参阅文档中的“ 热备查询冲突”部分。
不需要在主服务器上启动闲置事务。 在postgresql-9.1中解决这个问题最直接的方法是设置
hot_standby_feedback = on
这将使主人意识到长时间运行的查询。 从文档 :
第一个选项是设置参数hot_standby_feedback,这可以防止VACUUM删除最近死的行,因此不会发生清理冲突。
为什么这不是默认? 该参数是在初始实现之后添加的,这是备用数据库可以影响主数据库的唯一方法。
如此处所述,关于hot_standby_feedback = on
:
那么这样做的缺点就是,待机可能会让主人臃肿,这也许会让一些人感到惊讶
在这里 :
用什么设置的max_standby_streaming_delay? 我宁愿把它默认为-1,而不是默认的hot_standby_feedback。 这样,待机状态只会影响待机状态
所以我补充说
max_standby_streaming_delay = -1
并没有更多的pg_dump
错误对我们来说,也没有高手膨胀:)
长时间运行的查询正在运行时,热备用服务器上的表数据被修改。 确保表数据不被修改的解决scheme(PostgreSQL 9.1+)是暂停复制并在查询后恢复:
select pg_xlog_replay_pause(); -- suspend select * from foo; -- your query select pg_xlog_replay_resume(); --resume