我正在创建一个报告引擎,它通过备用服务器进行几次长查询,并使用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代码解决这个问题吗?我的临时解决方案很简单:捕获异常并重试所有失败的查询。也许可以做得更好(我希望如此)。
提前致谢
如果不改变PostgreSQL配置,你可以做任何事情来避免这个错误(从PostgreSQL 9.1开始,你可以将hot_standby_feedback
设置为on
)。
您正在以正确的方式处理错误 - 只需重试失败的事务。
在长时间运行的查询运行时,将修改热备用从属服务器上的表数据。确保表数据不被修改的解决方案(PostgreSQL 9.1+)是在从站上挂起复制并在查询后继续。
select pg_xlog_replay_pause(); -- suspend
select * from foo; -- your query
select pg_xlog_replay_resume(); --resume
我最近遇到了类似的错误,并且还处于无法访问底层数据库设置的dba / devops人员的位置。
我的解决方案是尽可能减少查询的时间。显然,这需要深入了解您的表和数据,但我能够通过结合使用更高效的WHERE过滤器,GROUPBY聚合和更广泛的索引来解决我的问题。
通过减少服务器端执行时间和数据量,可以减少发生回滚错误的可能性。
但是,在缩短窗口期间仍可能发生回滚,因此全面的解决方案还会在发生回滚错误时使用某些重试逻辑。
更新:一位同事实施了所述重试逻辑以及批量查询以使数据量更小。这三种解决方案使问题完全消失。