PostgreSQL 从库查询与复制冲突

PostgreSQL ERROR: canceling statement due to conflict with recovery
PostgreSQL ERROR: canceling statement due to conflict with recovery

PostgreSQL 在主从模式下,当我们在从库上执行查询的时候常常会遇到这样的问题。

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

在一个一主一从的异步流复制架构模型中,在从库上执行一个长时间的查询,提示如下的错误信息:
ERROR: canceling statement due to conflict with recovery
Detail: User query might have needed to see row versions that must be removed.

原理分析:
位于主节点的相关表做了 DDL 或者 DML 操作,wal 日志在备节点回放的时候,位于备节点上的查询操作还在进行,如此就会发生冲突。当发生冲突的时候,取消了位于备节点上执行的查询语句,所以报出了以上的错误信息。翻译一下上面的错误信息:
错误:由于与恢复冲突而取消语句
详细信息:用户查询可能需要查看必须删除的行版本。

可以看一下官网资料:--> 26.5.2. 处理查询冲突
https://www.postgresql.org/docs/current/hot-standby.html#HOT-STANDBY-CONFLICT
强制性地取消与要被应用的 WAL 记录冲突的后备查询。   

发生这种问题的原因主要分为两类:一类是 DDL、一类是 DML
对于 DDL 语句,可以设置参数 max_standby_streaming_delay 为 -1,表示会一直等待查询的语句结束为止。
对于 DML 语句,可以通过两种方式,一种是使用上面的方式,一种是设置参数 hot_standby_feedback 为 on。
hot_standby_feedback 的原理很简单,就是将备节点的最小活跃事务 ID 定期告知主节点,使得主节点在执行 VACUUM 时对这些事务还需要的数据不会删除。设置 hot_standby_feedback 的好处是可以减少备节点执行查询时复制冲突的可能,但也有其弊端,即会使主节点的相关表的数据延迟回收,从而导致数据膨胀;极端情况下,如果备节点有一个很长的事务,且涉及的表上 DML 操作又很频繁,则表的膨胀则会很严重。

此外还可以考虑设置 vacuum_defer_cleanup_age 参数的值,这个参数可以延迟清理 dead row,使得在备节点的查询可以读取这些 dead row,该参数的默认为 0,这个参数是在主节点上设置的。但是这种方法很难保证任何指定的执行时间窗口,因为 vacuum_defer_cleanup_age 是用主服务器上被执行的事务数来衡量的。查询取消的数量和原因可以使用后备服务器上的系统视图  pg_stat_database_conflicts 来查看。

在主库上执行:
SELECT * FROM pg_stat_replication;
sync_state 字段的值为 async 表示架构模型是异步的

SHOW max_standby_streaming_delay;
默认是 30S
参数 max_standby_streaming_delay 解释:当热后备机处于活动状态时,这个参数决定取消那些与即将应用的 WAL 项冲突的后备机查询之前,后备服务器应该等待多久。当 WAL 数据正在通过流复制被接收时,max_standby_streaming_delay 可以应用。默认值是 30 秒。如果没有指定,衡量单位是毫秒。值 -1 允许后备机一直等到冲突查询结束。这个参数只能在 postgresql.conf 文件中或在服务器命令行上设置。
注意:max_standby_streaming_delay 与取消一个查询能够运行的最长时间不同;它表示从主服务器接收到 WAL 数据并立刻应用它能够被允许的最长总时间。
允许一个 SQL 指令执行的最长时间是由参数 statement_timeout 来决定的。

在从库上执行:
SHOW hot_standby_feedback;
默认是关闭的 off
参数 hot_standby_feedback 指定一个热后备机是否将会向主服务器或上游后备机发送有关于后备机上当前正被执行的查询的反馈。这个参数可以被用来排除由于记录清除导致的查询取消,但是可能导致在主服务器上用于某些负载的数据库膨胀。反馈消息的发送频度不会高于每个 wal_receiver_status_interval 周期发送一次。默认值是 off。这个参数只能在 postgresql.conf 文件中或在服务器命令行上设置。如果使用级联复制,反馈将被向上游传递直到它最后到达主服务器。后备机在接收到反馈之后除了传递给上游不会做任何其他操作。这个设置不会覆盖主服务器上的 old_snapshot_threshold 的行为,后备服务器上一个超过了主服务器年龄阈值的快照可能会变得不可用,导致后备服务器上事务的取消。这是因为 old_snapshot_threshold 是为了对死亡行能够存在的时间给出一个绝对限制,不然就会因为一个后备服务器的配置而被违背。

vacuum_defer_cleanup_age (integer)
Specifies the number of transactions by which VACUUM and HOT updates will defer cleanup of dead row versions. The default is zero transactions, meaning that dead row versions can be removed as soon as possible, that is, as soon as they are no longer visible to any open transaction. You may wish to set this to a non-zero value on a primary server that is supporting hot standby servers, as described in Section 26.5. This allows more time for queries on the standby to complete without incurring conflicts due to early cleanup of rows. However, since the value is measured in terms of number of write transactions occurring on the primary server, it is difficult to predict just how much additional grace time will be made available to standby queries. This parameter can only be set in the postgresql.conf file or on the server command line.
You should also consider setting hot_standby_feedback on standby server(s) as an alternative to using this parameter.
This does not prevent cleanup of dead rows which have reached the age specified by old_snapshot_threshold.

查看视图:
SELECT * FROM pg_stat_database_conflicts;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/60728.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RT-DETR融合[CVPR2023]FasterNet种的PConv及相关改进思路

RT-DETR使用教程: RT-DETR使用教程 RT-DETR改进汇总贴:RT-DETR更新汇总贴 《Run, Don’t Walk: Chasing Higher FLOPS for Faster Neural Networks》 一、 模块介绍 论文链接:Run, Dont Walk: Chasing Higher FLOPS for Faster Neural Netwo…

【测试框架篇】单元测试框架pytest(2):用例编写

一、 前言 前面一章我们介绍了pytest环境安装和配置,并在pycharm里面实现了我们第一个pytest脚本。但是有些童鞋可能在编写脚本的时候遇到了问题,本文会讲一下我们编写pytest用例时需要遵守哪些既定的规则,同时这个规则也是可以修改的。 二…

嵌入式硬件电子电路设计(五)MOS管详解(NMOS、PMOS、三极管跟mos管的区别)

引言:在我们的日常使用中,MOS就是个纯粹的电子开关,虽然MOS管也有放大作用,但是几乎用不到,只用它的开关作用,一般的电机驱动,开关电源,逆变器等大功率设备,全部使用MOS管…

Conda安装软件错误(Pycharm)

conda的环境变量路径错误,比如移动了conda的文件位置conda的python版本不适合,python3.10现在更适合很多库conda对cmd没有初始化,conda init cmd.exe

《TCP/IP网络编程》学习笔记 | Chapter 11:进程间通信

《TCP/IP网络编程》学习笔记 | Chapter 11:进程间通信 《TCP/IP网络编程》学习笔记 | Chapter 11:进程间通信进程间通信的基本概念通过管道实现进程间通信通过管道进行进程间双向通信 运用进程间通信习题(1)什么是进程间通信&…

推荐一款高效的网站数据抓取工具:SysNucleus WebHarvy

SysNucleus WebHarvy是一款高效的网站数据抓取工具,支持从网页中提取文本、图像、URL 和电子邮件等内容,无需编写任何代码或脚本即可轻松实现数据抓取。用户可以通过 WebHarvy 内置的浏览器直观地浏览网页,指引软件提取所需的数据。它通过自动…

道陟科技EMB产品开发进展与标准设计的建议|2024电动汽车智能底盘大会

11月12日,2024电动汽车智能底盘大会在重庆开幕。会议由中国汽车工程学会主办,电动汽车产业技术创新战略联盟、中国汽车工程学会智能底盘分会、智能绿色车辆与交通全国重点实验室承办。本届大会围绕电动汽车智能底盘相关技术发展与融合,满足高…

Spring Authorization Server OAuth2.1

Spring Authorization Server介绍 Spring Authorization Server 是一个框架,它提供了 OAuth 2.1 和 OpenID Connect 1.0 规范以及其他相关规范的实现。 它建立在 Spring Security 之上,为构建 OpenID Connect 1.0 身份提供者和 OAuth2 授权服务器产品提供…

C++ 优先算法 —— 三数之和(双指针)

目录 题目:三数之和 1. 题目解析 2. 算法原理 ①. 暴力枚举 ②. 双指针算法 不漏的处理: 去重处理: 固定一个数 a 的优化: 3. 代码实现 Ⅰ. 暴力枚举(会超时 O(N)) Ⅱ.…

(三十三)队列(queue)

文章目录 1. 队列(queue)1.1 定义1.2 函数1.3 习题1.3.1 例题(周末舞会) 2. 双向队列(deque)2.1 定义2.2 函数2.3 题目2.3.1 例题(打BOSS) 1. 队列(queue) 队…

《FreeRTOS任务基础知识以及任务创建相关函数》

目录 1.FreeRTOS多任务系统与传统单片机单任务系统的区别 2.FreeRTOS中的任务(Task)介绍 2.1 任务特性 2.2 FreeRTOS中的任务状态 2.3 FreeRTOS中的任务优先级 2.4 在任务函数中退出 2.5 任务控制块和任务堆栈 2.5.1 任务控制块 2.5.2 任务堆栈…

springboot的社区团购系统设计录像

springboot的社区团购系统设计录像 springboot的社区团购系统设计

力扣每日一题

行变成回文: 对于每一行,遍历前半部分的元素,与后半部分的元素比较。如果不相等,计数器加 1,表示需要翻转一次。 列变成回文: 将矩阵转置,使用与行类似的方式对每一列进行统计。可以使用 Python…

linux c 语言回调函数学习

动机 最近在看 IO多路复用,包括 select() poll () epoll() 的原理以及libevent, 对里面提及的回调机制 比较头大,特写此文用例记录学习笔记。 什么是回调函数 网上看到的最多的一句话便是:回调函数 就是 函数指针的一种用法&am…

游戏引擎学习第九天

视频参考:https://www.bilibili.com/video/BV1ouUPYAErK/ 修改之前的方波数据,改播放正弦波 下面主要讲关于浮点数 1. char(字符类型) 大小:1 字节(8 位)表示方式:char 存储的是一个字符的 A…

# Python IDE的介绍和选择 --- 《跟着小王学Python》

Python IDE的介绍和选择 — 《跟着小王学Python》 《跟着小王学Python》 是一套精心设计的Python学习教程,适合各个层次的学习者。本教程从基础语法入手,逐步深入到高级应用,以实例驱动的方式,帮助学习者逐步掌握Python的核心概念…

柯桥生活英语口语学习“面坨了”英语怎么表达?

“面坨了”英语怎么表达? 要想搞清楚这个表达,首先,我们要搞明白“坨”是啥意思? 所谓“坨”就是指,面条在汤里泡太久,从而变涨,黏糊凝固在一起的状态。 有一个词汇,很适合用来表达这…

ZeroSSL HTTPS SSL证书ACMESSL申请3个月证书

目录 一、引言 二、准备工作 三、申请 SSL 证书 四、证书选型 五、ssl重要性 一、引言 目前免费 Lets Encrypt、ZeroSSL、BuyPass、Google Public CA SSL 证书,一般免费3-6个月。从申请难易程度分析,zerossl申请相对快速和简单,亲测速度非…

Java连接MySQL(测试build path功能)

Java连接MySQL(测试build path功能) 实验说明下载MySQL的驱动jar包连接测试的Java代码 实验说明 要测试该情况,需要先安装好MySQL的环境,其实也可以通过测试最后提示的输出来判断build path是否成功,因为如果不成功会直…

第四节-OSI-网络层

数据链路层:二层--MAC地址精确定位 Ethernet 2: 报头长度:18B 携带的参数:D MAC /S MAC/TYPE(标识上层协议)/FCS 802.3 报头长度:26B 携带的参数:D MAC/S MAC/LLC(标识上层协议)/SNAP(标识…