我正在创建一个报告引擎,它通过备用服务器进行几次长查询,并使用pandas处理结果。一切正常,但有时我使用psycopg2游标执行这些查询有一些问题:使用以下消息取消查询:
ERROR: cancelling statement due to conflict with recovery
Detail: User query might have needed to see row versions that must be removed
我正在调查此问题
PostgreSQL ERROR: canceling statement due to conflict with recovery
https://www.postgresql.org/docs/9.0/static/hot-standby.html#HOT-STANDBY-CONFLICT
但所有解决方案都建议修复问题,修改服务器的配置。我无法进行这些修改(我们赢得了最后一场针对IT人员的足球比赛:))所以我想知道如何从开发人员的角度来处理这种情况。我可以使用python代码解决这个问题吗?我的临时解决方案很简单:捕获异常并重试所有失败的查询。也许可以做得更好(我希望如此)。
提前致谢
答案 0 :(得分:5)
在不更改PostgreSQL配置的情况下,您无法做任何事情来避免该错误(从PostgreSQL 9.1开始,您可以将hot_standby_feedback
设置为on
)。
您正在以正确的方式处理错误 - 只需重试失败的事务。
答案 1 :(得分:2)
在长时间运行的查询运行时,将修改热备用从属服务器上的表数据。确保表数据不被修改的解决方案(PostgreSQL 9.1+)是在从服务器上挂起复制并在查询后恢复。
select pg_xlog_replay_pause(); -- suspend
select * from foo; -- your query
select pg_xlog_replay_resume(); --resume
答案 2 :(得分:1)
我最近遇到了类似的错误,而且也无法成为有权访问基础数据库设置的 dba / devops 人。
我的解决方案是尽可能地减少查询时间。显然,这需要您对表和数据有深入的了解,但是我可以结合使用更高效的WHERE过滤器,GROUPBY聚合和更广泛地使用索引来解决我的问题。
通过减少服务器端执行时间和数据量,可以减少发生回滚错误的机会。
但是,在缩短的窗口期间仍可能发生回滚,因此,全面的解决方案还可以在发生回滚错误时利用一些重试逻辑。
更新:一位同事实现了上述重试逻辑以及对查询进行批处理以减小数据量。这三个解决方案使问题完全消失了。