在待机模式下对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
对如何解决有什么建议吗?谢谢
发布于 2013-01-30 07:51:55
在热备份服务器上运行查询有点棘手-它可能会失败,因为在查询过程中,可能会在主服务器上更新或删除一些需要的行。因为主节点不知道查询是在次节点上启动的,所以它认为可以清理(真空)其行的旧版本。然后,次要必须重放此清理,并必须强制取消所有可以使用这些行的查询。
更长的查询将更频繁地被取消。
您可以通过在主服务器上启动一个可重复的读事务来解决此问题,该事务将执行一个虚拟查询,然后在次要服务器上运行真正的查询时处于空闲状态。它的存在将阻止对主服务器上的旧行版本进行清理。
有关此主题和其他解决方法的更多信息,请参阅文档中的Hot Standby — Handling Query Conflicts部分。
发布于 2017-12-06 03:33:42
不需要碰hot_standby_feedback
。正如其他人所提到的,将其设置为on
可能会使master膨胀。想象一下,在从服务器上打开事务,而不是关闭它。
相反,将max_standby_archive_delay
和max_standby_streaming_delay
设置为某个合理的值:
# /etc/postgresql/10/main/postgresql.conf on a slave
max_standby_archive_delay = 900s
max_standby_streaming_delay = 900s
这样持续时间小于900秒的slaves查询不会被取消。如果您的工作负载需要更长的查询,只需将这些选项设置为更高的值。
发布于 2017-10-05 16:56:02
热备从机上的表数据在长时间运行查询时被修改。确保表数据不被修改的一种解决方案(PostgreSQL 9.1+)是暂停复制,并在查询后恢复:
select pg_xlog_replay_pause(); -- suspend
select * from foo; -- your query
select pg_xlog_replay_resume(); --resume
https://stackoverflow.com/questions/14592436
复制相似问题