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