canceling statement due to conflict with recovery

报错: 
canceling statement due to conflict with recovery 
DETAIL:  User query might have needed to see row versions that must be removed. 

Hot Standby 环境下的 standby 节点执行查询时报错,报错信息如下: 
1、执行长时间查询时报错。 
   根据错误信息,初步估计当在从库上执行查询时,与主库发生了冲突。 
           
2、网上GOOGLE ,信息如下   
   Long running queries on the standby are a bit tricky, because they 
might need to see row versions that are already removed on the master.   
备注:意思是说,长时间SQL如果跑在 standby 节点上是一个笑话,因为 standby 节点有可能需要读取主库上被 removed 的数据。    

3、解决方法,修改参数 
   根据实际情况,调大参数:max_standby_streaming_delay = 30min; 
  
   当在 Standby 提供应用时,如果 Standby 节点上的SQL 与接收主库日志发生冲突时, 
这个参数决定了从库等侍这个查询的时间,默认值为 30s, 有SQL执行时间估计在二分钟左 
右,从而被 Standby库主动 Cancel 了。也可以将这个参数设置成 -1. 表示 standby 节点永远等侍这个查询, 
这无疑是有风险的,如果这个查询不结束,那么从库一直处于与主库的中断状态,不会同步主库数据,而会一 
直等从库这个SQL执行完成。 

4、其他说明 
   PostgreSQL 的 Hot Standby常被用来当只读的数据库提供查询或者统计服务, 但是由于各种原因查询SQL可能被cancel掉。 
例如: 
1)主库执行了DROP某TABLE的操作, 而standby库上某用户正在查询这个表的数据. 当standby接收到了这些XLOG的信息并且 
准备在standby库上apply的时候, 如果这个SQL还在执行, 就发生冲突了, 这个时候standby 要判断是否要cancel掉这个SQL 
使得apply可以正常进行下去, 或者standby选择等待多长时间. 

2)主库执行删除表空间或者删除库等相关的操作也会遇到上面的问题. 

3)更隐晦的是主库上执行了vacuum操作, 这些被vacuum掉的tuple, 可能是standby库上的SQL可见的TUPLE, 也会发生冲突. 

4)还有其他原因 

那么Standby根据什么来判断是CANCEL SQL还是选择等待, 如果等待, 等多长时间?有两个参数控制: 
max_standby_archive_delay 
max_standby_streaming_delay 

    如果值等于-1表示永不因为recovery 和SQL冲突原因cancel standby上的SQL. 
    如果设置了一个值如30秒, 那么在cancel 冲突的SQL前, 会等待,通过GetStandbyLimitTime来判断是否要触发CANCEL SQL, 当GetStandbyLimitTime返回的值为0 时表示永不触发CANCEL, 如果返回的是一个时间值, 这个时间值和当前时间进行比较,如果小于当前时间则进行CANCEL操作.

时间: 2024-12-03 07:35:38

canceling statement due to conflict with recovery的相关文章

random-canceling statement due to user request

问题描述 canceling statement due to user request postgresql用的是9.4版本,驱动也用到9.4版本,jdk用的1.7 我们的系统前端有一个删除项目的操作,后台用的spring boot+spring mvc+mybatis,删除操作实际调用一个postgresql函数,函数部分执行语句如下: CREATE OR REPLACE FUNCTION delete_eplus_project_cascade(projectid character va

PostgreSQL源码分析 备库查询冲突 - User was holding shared buffer pin for too long

背景 PostgreSQL 的基于流复制的物理备库是基于redo的物理块复制备库,允许开放只读的功能,但是需要注意,由于主库可能不断的产生redo,这些redo可能会与备库的QUERY产生冲突. 什么情况下query会堵塞.或与恢复冲突? 当以下操作产生的REDO被复制到备库,并且备库准备拿这些REDO来恢复时. Access Exclusive locks taken on the primary server, including both explicit LOCK commands an

PostgreSQL backup and recovery - online logical backup & recovery

PostgreSQL 逻辑备份, 指在线备份数据库数据, DDL以SQL语句形式输出, 数据则可以以SQL语句或者固定分隔符的形式输出.  备份时不影响其他用户对备份对象的DML操作.  本文主要介绍一下PostgreSQL提供的逻辑备份工具pg_dump, pg_dumpall, 以及数据库的COPY命令. pg_dump :  使用pg_dump进行备份时, 其他用户可以同时进行DML(SELECT, UPDATE, DELETE, INSERT)操作, 相互之间没有干扰.  一.pg_du

PostgreSQL 递归死循环案例及解法

背景 PostgreSQL 提供的递归语法是很棒的,例如可用来解决树形查询的问题,解决Oracle用户 connect by的语法兼容性. 请参考https://yq.aliyun.com/articles/54657 但是如果参与递归查询的数据集有问题,例如数据打结的问题.则会导致递归死循环,可能导致临时文件暴增,把空间占满,影响业务. 案例 假设c1,c2是上下级关系,c2是c1的上级ID.创建测试表如下 create table test(c1 int, c2 int, info text

pg_cancel_backend()和pg_terminate_backend()

pg_cancel_backend()和pg_terminate_backend()  两个函数的官方解释: pg_cancel_backend() 取消后台操作,回滚未提交事物 pg_terminate_backend() 中断session,回滚未提交事物  pg_cancel_backend()举例: session A: postgres=# create table t1 (a int); CREATE TABLE postgres=# begin; postgres=# insert

PostgreSQL 最佳实践 - 在线逻辑备份与恢复介绍

背景 PostgreSQL 逻辑备份, 指在线备份数据库数据, DDL以SQL语句形式输出, 数据则可以以SQL语句或者固定分隔符(row格式)的形式输出. 备份时不影响其他用户对备份对象的DML操作. 本文主要介绍一下PostgreSQL提供的逻辑备份工具pg_dump, pg_dumpall, 以及数据库的COPY命令的备份方法. pg_dump 使用pg_dump进行备份时, 其他用户可以同时进行DML(SELECT, UPDATE, DELETE, INSERT)操作, 相互之间没有干扰

MySQL TOO BAD row's Range Lock Compare with PostgreSQL and Oracle

MySQL的InnoDB引擎,当UPDATE一个范围的数据时,会锁住比预期更多的ROW,而Oracle和PostgreSQL没有这种现象.来自<High Performance MySQL>一书.测试版本:MySQL 5.5.10PostgreSQL 9.0.2Oracle 10.2.0.4举例如下:1. MySQL (有索引的情况)Session One:mysql> create table tbl_user (id int,firstname varchar(32),lastnam

如何防止数据库雪崩

如何防止数据库雪崩 作者 digoal 日期 2016-09-08 标签 PostgreSQL , DDL雪崩 , 业务雪崩 , 语句超时 , 数据库雪崩 , 数据库预热 背景 在数据库的使用过程中,一些微妙的操作,在特殊的场景中就可能导致雪崩效应. 1. 当数据库中存在未提交事务,并且未提交事务已经持有了某个表的哪怕是最小的锁时,如果此时对这个对象发起DDL操作,这个DDL操作将会堵塞接下来的其他对该对象的任意操作请求,包括读请求. 因为PG的锁等待判断是整个等待队列的冲突判断,这种判断的目的

PostgreSQL 数据去重大法

标签 PostgreSQL , 去重 , 单列去重 , 多列去重 , 行去重 , 多列混合去重 , varidict 参数 , 数组排序 , 数组元素重排 背景 去重的需求比较常见,去重也可以衍生出很多变种.例如 1. 单列去重,很好理解,就是按某列去除重复记录.保留规则(例如保留最新的,保留最旧的,或者保留某个其他字段最大的). 2. 多列去重,按多列,去除重复记录.保留规则(例如保留最新的,保留最旧的,或者保留某个其他字段最大的). 3. 行去重,按行,去除重复记录.保留规则(例如保留最新的