当前位置: 首页 > 知识库问答 >
问题:

PostgreSQL错误:由于与恢复冲突而取消语句

华炜
2023-03-14

在待机模式下对PostgreSQL db运行查询时,我得到以下错误。导致错误的查询在1个月内正常工作,但当查询超过1个月时,会导致错误。

ERROR: canceling statement due to conflict with recovery
Detail: User query might have needed to see row versions that must be removed

有什么解决的建议吗?谢谢

共有3个答案

井唯
2023-03-14

无需在主机上启动空闲事务。在postgresql-9.1中,解决这个问题最直接的方法是设置

hot_standby_feedback = on

这将使主服务器意识到长时间运行的查询。从文档中:

第一个选项是设置参数hot_standby_feedback,它可以防止真空清除最近死掉的行,因此不会发生清理冲突。

为什么这不是默认值?这个参数是在初始实现之后添加的,这是备用程序影响主程序的唯一方式。

堵雅健
2023-03-14

在热备服务器上运行查询有些棘手——它可能会失败,因为在查询过程中,一些需要的行可能会在主服务器上被更新或删除。由于主服务器不知道查询是在辅助服务器上启动的,它认为它可以清理(真空)其行的旧版本。然后辅助服务器必须重播此清理,并必须强制取消所有可以使用这些行的查询。

较长的查询将更频繁地被取消。

您可以通过在主服务器上启动一个可重复读取事务来解决这个问题,该事务执行虚拟查询,然后在辅助服务器上运行真正的查询时处于空闲状态。它的存在将防止主服务器上的旧行版本被清空。

有关此主题和其他解决方法的更多信息,请参阅文档中的热备份-处理查询冲突部分。

宋智明
2023-03-14

无需触摸hot\u standby\u feedback。正如其他人所提到的,将其设置为on会使主机膨胀。想象一下,在从属服务器上打开事务,而不是关闭它。

相反,将max_standby\u archive\u delaymax_standby\u streaming\u delay设置为某个正常值:

# /etc/postgresql/10/main/postgresql.conf on a slave
max_standby_archive_delay = 900s
max_standby_streaming_delay = 900s

这样,对持续时间小于900秒的从站的查询就不会被取消。如果您的工作负载需要更长的查询,只需将这些选项设置为更高的值。

 类似资料:
  • 问题内容: 是什么导致了Postgresql中的此错误? 我的软件版本: PostgreSQL的 我的PostgreSQL驱动程序是: 使用java版本: 提示:我的postgresql数据库位于固态硬盘上,并且此错误是随机发生的,有时根本不会发生。 问题答案: 我们已经找到了造成此问题的原因。最新的JDBC驱动程序9.2-100x中setQueryTimeout()的错误实现解释了这一点。如果您

  • 问题内容: 我正在尝试将SQL Azure数据库的备份(.bacpac)还原到另一个SQL Azure数据库,但是由于以下错误而无法恢复: 服务操作期间遇到错误。无法导入包。错误SQL72014:.Net SqlClient数据提供程序:消息547,级别16,状态0,第3行ALTER TABLE语句与FOREIGN KEY约束“ FK_x_xx”发生冲突。数据库“ x”的表“ dbo.x”中发生了

  • 问题内容: INSERT语句与CHECK约束“ ”冲突。在数据库“ C:\ DOCUMENTS AND SETTINGS \ KARTHIKEYAN \ DESKTOP \ KOK \ DB \ INFT3009_ASS1_C3104855.MDF”的表“ dbo.Members”的列“ ”中发生了冲突。该语句已终止。 我在Visual Studio 2008 Express中使用.MDF文件。我

  • 忽略依赖项的警告 警告:dependency org.apache.httpcomponents:httpclient:4.0.1在调试时被忽略,因为它可能与Android提供的内部版本冲突。如果有问题,请用jarjar重新打包以更改类包警告:dependency org.apache.httpcomponents:httpclient:4.0.1将被忽略以发布,因为它可能与Android提供的内

  • 问题内容: 我有一个带有客户ID的table_Project(链接到tbl_Customer)。在tbl_Customer中,我有Customer_ID(作为密钥)和其他一些信息,例如电话,电子邮件等。 要将其从Gridview中删除,请使用以下DeleteCommand: 但这给了我以下错误: 但是通过更新CustomerInfo我没有得到任何错误。我已经看到了C#的不同解决方案,但是我使用.n

  • 我在composer安装laravel sanctum时遇到这个错误 无法将您的需求解析为可安装的软件包集。问题1-laravel/sanctum[v2.9.0,…,2.x-dev]需要照明/合同^6.9 | ^7.0 | ^8.0- 我试着通过 但是你会得到这个错误 无法将您的需求解析为可安装的软件包集。 问题1-根生成器。json需要Illumb/contracts^8.36,找到Illumb