学了这么久,PostgreSQL 这些指标到底是什么?

PostgreSQL开发与实战(7.2)多版本并发控制2 作者:太阳。 阅读详情

1

什么是可见性指标?

简单来说,可见性指的是在特定的状态、后台进程或事务中,一行数据(默认为堆元组)是否应该向用户显示。

例如:

  • 用户通过UPDATE将数据记录从‘A’更改为‘B’。

  • PostgreSQL 通过INSERT新记录‘B’的方式处理,同时将记录‘A’标记为‘不可见’。

  • 系统中同时存在这两条记录,但‘B’是可见的,‘A’则不可见。

  • 已被删除或不可见的记录也被称为‘死’元组。

  • VACUUM进程的职责之一是清除这些‘死’元组以释放空间。

MVCC(多版本并发控制)作为一种方法,在每次写操作都会创建数据的“新版本”,同时保留“旧版本”。该方法允许并发的读写操作而不会出现相互阻塞。PostgreSQL使用MVCC的变体(也称快照隔离)来隔离并发事务。

因此,单个数据可能会有多个“版本”,PostgreSQL负责根据多种因素确定应向用户呈现哪个“版本”。这个过程也被称为“可见性检查”或“可见性控制”。

在本文中,我们将深入探讨PostgreSQL的可见性检查机制,以了解其工作原理。

2

可见性指标

据我所知,PostgreSQL 根据以下指标确定数据的可见性:

  • Transaction ID

  • xmin

  • xmax

  • cid

  • transaction snapshot

  • CLOG (Commit Log)

  • hintbit

这些指标到底是什么?让我们来一探究竟。

3

事务 ID

这应该是不言自明的。在 PostgreSQL 中,所有事务都与一个被称为事务ID的编号相关联。这主要用于检查相关数据是否在当前事务中插入或删除。我们将在文章的后面部分对此进行进一步探讨。

xmin, xmax, cid 和hintbit

这些指标被归为一类,因为它们都存储在每个堆数据元组的头部,并且每个数据元组可能具有不同的值,从而导致不同的可见性检查结果。下面的图像显示了它们存储在元组头部的位置:

图片

xmin:

这是插入该堆数据元组的事务ID

xmax:

  • 这是删除该堆数据元组的事务ID。

  • 如果元组头部含有有效的、已提交的 xmax 值,通常说这个元组是“已删除的”或“不可见的”。

cid:

  • 这是在事务中插入此数据元组的命令ID。

  • 主要用于确定当前事务中的可见性。

  • 如果一个事务包含 SELECT 和其他 DML 查询(INSERT、UPDATE 和 DELETE),那么可以使用cid 来确定一个数据元组是在 SELECT 之前还是之后被插入或删除。

hintbit:

  • 这是一个标志字段,用于存储来自CLOG的查询结果,这样PostgreSQL就不必每次都查找CLOG。CLOG指的是提交日志,下文会详细解释。

  • 如果hintbit设置了HEAP_XMIN_COMMITTED标志,这意味着插入此元组的事务ID(即xmin)已提交。

  • 如果PostgreSQL可以直接从hintbit获取这些信息,那么它可以节省一些查找CLOG的时间,从而提高性能。

  • 可能的hintbit标志值如下:

图片

4

CLOG (Commit Log)

CLOG 是存储在共享内存中并持久化在 $PGDATA/pg_xact 目录下的数据结构。CLOG 的目的是记录事务的提交状态。状态可以是以下之一:

  • COMMITTED

  • IN_PROGRESS

  • ABORTED

  • SUB_COMMITTED

例如:

如果一个元组的 xmin 是 103,而 CLOG 显示 103 是 ABORTED(如下图所示),这意味着 103 不可见,因为插入该数据元组的事务已经 ABORTED(即中止)。为了提高性能,PostgreSQL 将会标记 hintbit 为 HEAP_XMIN_INVALID,这样下次再访问同样的数据元组时就不需要再从 CLOG 中查找了。

图片

5

事物快照

事务快照是另一个数据结构,用于存储某个时间点的活跃事务信息。它主要用来在并发事务中隔离数据元组。一个数据元组可能被另一个事务插入并提交了,但是我持有的事务快照可能是过去的。在这种情况下,根据我过去的快照,这个数据元组对我来说仍然是不可见的。

一个事务快照可以由几个事务号来表示:

[xmin, xmax, xip_list]

  • xmin: 仍然活跃的最小事务ID — 小于这个值的事务已经提交或回滚。

  • xmax: 已提交或回滚的最大事务ID + 1 — 大于或等于这个值的事务尚未提交或回滚。

  • xip_list: 正在进行中的事务号列表 — 应该大于xmin并且小于xmax。

请注意,事务快照中的 xmin 和 xmax 的定义与上文中存储在元组头部的 xmin 和 xmax 是不同的。

通过示例可以更好的解释事务快照。

假设我们有三个并发的后端进程 A、B 和 C,分别启动事务号为 747、748 和 749,每个事务插入了数据记录 'A'、'B' 和 'C'。

postgres=# BEGIN;Postgres*# INSERT INTO mytable VALUES('A');Postgres*# SELECT txid_current(); txid_current--------------          747(1 row)​​​​​​
postgres=# BEGIN;postgres=# INSERT INTO mytable VALUES('B');postgres=# SELECT txid_current(); txid_current--------------          748(1 row)​​​​​​​
postgres=# BEGIN;Postgres*# INSERT INTO mytable VALUES('C');Postgres*# SELECT txid_current(); txid_current--------------          749(1 row)

然后,我们提交了事务 749,并通过 "pg_current_snapshot()" 获取了当前的事务快照。

​​​​​​​

postgres=# BEGIN;Postgres*# INSERT INTO mytable VALUES('A');Postgres*# SELECT txid_current(); txid_current--------------          747(1 row)
​​​​​​​
postgres=# BEGIN;postgres=# INSERT INTO mytable VALUES('B');postgres=# SELECT txid_current(); txid_current--------------          748(1 row)

​​​​​​​

postgres=# BEGIN;Postgres*# INSERT INTO mytable VALUES('C');Postgres*# SELECT txid_current(); txid_current--------------          749(1 row)
Postgres*# COMMIT;
postgres=# select pg_current_snapshot(); pg_current_snapshot--------------------- 747:750:747,748(1 row)

从后端进程 C 的角度来看,事务快照显示:

  • 747 是仍然活跃的最小事务ID。

  • 750 是已提交或已中止的最大事务ID + 1(749 + 1)。

  • 747 和 748 是仍在进行中的事务。

这意味着:

  • C 能够看到由事务ID小于750的数据元组插入的数据,但不能看到事务ID为747和748的数据,因为它们仍在进行中(尚未提交或回滚)。

  • C 不能看到未来插入的数据元组(事务ID大于750的数据)。

  • C 能够看到由自己在事务749中插入的数据元组,因为它刚刚提交了这个事务。

我们也可以在事务进行中查看 A 和 B 的事务快照。​​​​​​​

postgres=# BEGIN;Postgres*# INSERT INTO mytable VALUES('A');Postgres*# SELECT txid_current(); txid_current--------------          747(1 row)


Postgres*# select pg_current_snapshot(); pg_current_snapshot--------------------- 747:750:748(1 row)​​​​​​​
postgres=# BEGIN;postgres=# INSERT INTO mytable VALUES('B');postgres=# SELECT txid_current(); txid_current--------------          748(1 row)


postgres=*# select pg_current_snapshot(); pg_current_snapshot--------------------- 747:750:747(1 row)​​​​​​​
postgres=# BEGIN;Postgres*# INSERT INTO mytable VALUES('C');Postgres*# SELECT txid_current(); txid_current--------------          749(1 row)
Postgres*# COMMIT;
postgres=# select pg_current_snapshot(); pg_current_snapshot--------------------- 747:750:747,748(1 row)

如您所见,A 的事务快照表明 B(748)正在进行中,因此它还不能看到 B(748)插入的数据元组。事务 747 是当前 A 所在的事务,但在快照中没有标记,因此它可以看到当前事务中由自己插入的数据。B 的事务快照表明情况恰恰相反。

6

确定可见性

上面提到的可见性指标只是部分指标;这意味着我们不能仅凭其中一个或少数几个指示来确定数据元组的真实可见性。必须考虑全部指标来计算正确的可见性。

让我们总结一下决定可见性的因素:

  • xmin、xmax、cid 和 hintbit 存储在元组头部。

  • 快照(snapshot)、事务ID在启动事务时由事务管理器提供。

  • CLOG 存储在共享内存中

下图是可见性检查的简化说明:

图片

这只是对整个可见性检查过程的简要概述。该过程可以在 src/backend/heap/heapam_visibility.c 文件的 heapTupleSatisfiesMVCC() 函数中找到。当然,实际的逻辑比上面的示意图更复杂。

我已经研究了 PostgreSQL 可见性检查逻辑的整个过程,并制作了下面更详细的流程图:可见性检查可以像这张图展示的那样深入,但由于使用了hintbit,只需通过使用数据元组的 xmin 和 xmax 值检查 hintbit 和快照,就可以很快完成大多数可见性检查。

图片

7

总结

如果您是一名在从事分布式数据库、共享存储集群或分片技术的 PostgreSQL 开发者,我相信本文能为您提供有关 PostgreSQL 如何处理可见性检查的见解。当我们开始与多个数据库节点交互时,数据的原子性和可见性始终是一个问题。如何确保整个集群中的数据一致性是一个常见的挑战。了解事务和可见性的基本原理可以帮助我们解决这些问题。

使用R语言中的xmin参数和xmax参数指定X轴的数据范围 利用R的基础绘图功能,我们可以使用xmin参数和xmax参数来指定X轴的数据范围。通过使用xmin参数和xmax参数,我们可以在R语言中轻松地指定X轴的数据范围。假设我们有一个包含X和Y值的数据集,我们想要绘制Y随X变化的折线图,并将X轴的范围限制在特定的区间内。希望本文对你理解如何使用xmin参数和xmax参数来指定X轴的数据范围有所帮助。现在,假设我们只对X轴的范围感兴趣,希望将X轴的范围限制在20到80之间。使用R语言中的xmin参数和xmax参数指定X轴的数据范围。在上述代码中,我们通过在。 阅读详情

相关推荐

2-postgresql监控告警指标及告警阈值设置

除了文档中的指标,还有哪些其他重要的监控项?如何确定适合告警的指标以及告警公式和阈值?如何根据监控项列表设置有效的告警策略?

xuebo1129927648的博客 439

PostgreSQL随读笔记-事务下

事务

qq_32892029的博客 492

PostgreSQL 数据类型.xmind

PostgreSQL中数据类型的思维导图,Xmind格式。包括以下分类,数值类型,货币类型,字符类型,日期时间类型,布尔类型,枚举类型,几何类型,网络地址类型,位串类型,文本搜索类型,UUID类型,XML类型,JSON类型,数组类型,复合类型,范围类型等等。

对PostgreSQL xmin的深入学习

当PostgreSQL需要insert 一条记录的时候,它会把记录头放入xmin,xmax等字段。 xmin的值,就是当前的Transaction的TransactionId。这是为了满足MVCC的需要。 跟踪程序进行了解: /* * Allocate the next XID for a new transaction or subtransac...

weixin_33720078的博客 673

智能驾驶感知模块的测试评估方法(上)

对于智能驾驶系统而言,感知模块是开发难度最大、投入资源最多的核心部分。在智能驾驶开发团队内部,感知模块需要独立进行评测才能及早发现潜在缺陷或判断性能是否有改进。随着近几年BEV、OCC、E2E等新技术方案被越来越多企业应用,感知的评测变得越来越艰难,效率也变得越来越低下。本文作者基于在智驾测试行业多年经验,试图总结感知评测的基本规律和效率提升方法,以供读者一些启发。

vincent_321的博客 2559

如何导入su_利用GIS快速生成SU场地模型

01|前言:进入2021年了,希望大家也是一个新的开始。告诫自己多写文章多更新,多读点书多旅行。然而元旦由于出去玩了4天,积累了一些事情要处理,一直没有时间好好写点东西。今天给大家带来的分享主题叫“利用GIS快速生成SU场地模型”。相关的视频方法其实B站上也有,但我相信视频很多人都不会看,我自己也是。直接给大家上操作流程。主要的操作步骤是【获取场地的矢量shp文件】—【导入ArcScen...

weixin_33806859的博客 9813

PostgreSQL中的技术内幕

PostgreSQL中的技术内幕

u011868279的博客 2064

开发板的使用

一、开发板使用学习大纲。 1、开发板组成、核心板资源,底板资源。 2、开发板连接、调试工具、串口参数配置。 3、开发板启动过程。 4、文件传输 1)使用串口传输。 上传/下载 2)使用网口传输。 上传/下载 5、临时/永久配置开发板IP地址。 6、开发板启动脚本。 二、开发板的组成。 核心板: CPU处理器: 芯片:S5P6818(三星) 内核: ARM cortex-A53 -> 八核处理器 运行内存:512MB*2=1G nandflash:4G 底板: 电源线:5V 串口...

qq_45633736的博客 2659

Prometheus自定义PostgreSQL监控指标

提供默认指标,它们非常有用。但也支持灵活地使用yaml文件添加自定义指标。metrics:它的结构非常简单,每个部分都需要了解一些注意事项:metric_name:与你想要的度量名称一样简单。master:在复制环境中,这个值经常与Leader主机混淆。但它真正的意思是查询将只在DATA_SOURCE_NAME参数中配置的数据库中执行。cache_seconds:再次运行查询之前保留最后值的时间。如果度量数据不经常更改,请考虑添加此参数。

neweastsun的专栏 2533

基于光电传感的非接触式酒精浓度检测系统设计与实现

本文详细介绍了基于光电传感技术的非接触式酒精浓度检测系统设计与实现。系统利用940nm红外LED和OPT101光电传感器,结合朗伯-比尔定律,通过STM32微控制器进行信号采集与处理,实现了快速、准确的酒精浓度测量,测量精度达±1%,适用于工业检测和便携式应用场景。

y7z8a的博客 365

读书笔记 | 财务会计理论(第7版 William R.Scott)(中):契约视角下的会计信息价值

本文从契约理论视角深入剖析了财务会计信息的核心价值。文章指出,会计信息作为关键的“契约润滑剂”,通过债务合同与薪酬合同等具体形式,有效解决了公司内外的信息不对称与道德风险问题,协调了股东、债权人及管理层等多方利益,是公司治理与资本市场有效运转的基石。

mac99的博客 331

PostgreSQL 监控 - 高频指标

PostgreSQL 实时健康监控 大屏 - 高频指标 - 珍藏级 作者 digoal 日期 2018-06-13 标签 PostgreSQL , 大屏指标 , qps , long query , locks , active , idle in transaction , long idle in transaction , 2PC 背景 最关键的一些数据库健康指标,趋势监测。...

Hehuyi_In的博客 5834

语义通信实战:跳过“比特”保“语义”,手把手构建轻量级图像压缩重建网络(基于PyTorch)

本文详细介绍了基于PyTorch的轻量级语义通信系统LICRnet的实现,专注于图像压缩重建中的语义信息保留。通过深度可分离卷积、可变窗口多尺度注意力等创新技术,显著降低计算量并提升性能,特别适用于无人机巡检、远程医疗等物联网场景。文章包含完整的代码实现、训练策略及部署优化方案。

weixin_27697385的博客 221

PostgreSQL 常用监控指标

QPS指标来自pg_stat_statements,由于这个插件有一个STATEMENT采集上限,可配置,例如最多采集1000条SQL,如果有新的SQL被采集到时,并且1000已用完,则会踢掉最老的SQL。当前系统中在事务中并且处于空闲状态的会话有多少,很多,说明业务端的处理可能比较慢,如果结合锁等待发现有大量锁等待,并且活跃会话数有突增,可能需要关注并排查业务逻辑的问题。同时需要注意,由于pg_stat_statements跟踪的SQL有限,最近未访问过的SQL的跟踪信息可能被抛弃。

不积跬步,无以至千里;不积小流,无以成江海。 4061

华为OD技术面真题 - 数据库Mysql - 1

汇总华为OD技术面高频Mysql相同问题,提供详细解答。

qq_45776114的博客 1086

把 ABAP SQL 窗口函数讲透:从 OVER 到 LEAD、RANK 与累计分析

ABAP SQL窗口函数在不丢失明细记录的前提下,为每行数据提供组内统计和排名功能。它通过OVER子句定义计算窗口,支持三类函数:聚合型(AVG/SUM等)、排名型(ROW_NUMBER/RANK等)和取值型(LEAD/LAG)。相比GROUP BY会合并多行数据,窗口函数保留原始记录同时附加计算结果,特别适合需要保留明细又要展示统计信息的业务场景,如销售排名、客户分层分析等。语法核心是OVER子句,通过PARTITION BY分组,ORDER BY排序,可灵活定义计算范围。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1274

PostgreSQL监控指标

 数据库版本:9.3.1(不同版本数据库相关表列名可能略有不同) 数据库状态信息 数据库状态信息主要体现数据库的当前状态 1.目前客户端的连接数 postgres=# SELECT count(*) FROM pg_stat_activity WHERE NOT pid=pg_backend_pid(); 2.连接状态 postgre

kongjunlongaa的博客 6151

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

SkyWalking 监控 PostgreSQL:基于 postgres-exporter 与 OpenTelemetry 的指标采集及慢 SQL 采集方案

本文围绕 SkyWalking OAP 的 PostgreSQL 监控能力展开,系统讲解两条核心链路:一是借助 postgres-exporter 与 OpenTelemetry Collector 将 PostgreSQL 运行指标送入 [Meter 系统](https://link.gitcode.com/i/977d3ee80cb63433d3888a071bd1651f),形成 `Laye

gitblog_01164的博客 385

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

PostgreSQL 性能监控:CloudNativePG 关键指标与分析

你是否还在经历数据库性能突发故障时的手忙脚乱?当业务投诉查询延迟飙升,或 replication 链路中断导致数据不一致时,传统事后排查方式往往耗时数小时。CloudNativePG 提供的全方位监控体系,让你通过 12 类核心指标、3 层监控维度和 7 个关键告警阈值,实现从被动响应到主动预警的转变。本文将深入解析 CloudNativePG 的监控架构,教你如何通过 Prometheus 指标...

gitblog_00611的博客 1169

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

怎样监控 PostgreSQL 数据库的性能指标?

对于一些复杂的监控需求,我们还可以编写自定义的脚本,结合监控系统(如 Nagios、Zabbix 等)来实现更灵活、更全面的监控。比如,我们可以使用 Python 编写脚本来定期获取 PostgreSQL 的性能指标,并将其发送到监控系统进行报警和可视化展示。这就好比我们自己动手打造了一套专属的“监控雷达”,能够按照我们的需求精确地捕捉数据库的每一个细微变化。监控 PostgreSQL 数据库的性能指标是一项至关重要的任务,它是保障数据库稳定运行、优化性能的基石。

发现生活,分享智慧,一起成长! 1788

ProxySQL 的 Prometheus Protocol 标签:解决 MySQL 与 PostgreSQL 指标冲突的完整实践指南

本文围绕 ProxySQL `v3.0-5069` 分支引入的 **Prometheus `protocol` 标签(Protocol Labels)** 机制,完整解析其背景、根因、源码实现与运维实践。该特性解决了 MySQL 与 PostgreSQL 两大模块在同一 ProxySQL 实例上注册相同名称 Prometheus 指标时的碰撞问题,让用户能够通过 `protocol="mysql"

gitblog_00918的博客 155

使用 Vector 将 PostgreSQL 日志输出为 Prometheus 指标

新钛云服已累计为您分享728篇技术干货本文讨论使用日志作为数据源生成 Prometheus 指标。如果现有 exporters 提供的指标无法满足需求,或者 exporter 因授权原因无法对外公开,则可以参考本文提供的方式。写本文的原因是,我们的一位客户希望能够及时获取有关从应用程序到 PostgreSQL v14 数据库的失败查询的信息。同时,我们必须在不对应用程序代码进行任何更改的情况下实现...

NewTyun的博客 754

PostgreSQL常用指标监控

- pg_stat_get_db_xact_commit 为stable函数,一个事务中两次调用之间只执行一次,所以需要外部多次执行。--阻塞pid对应的是数据库中pid,可以使用select pg_terminate_backend(pid);事务提交,事务回滚,全表扫描,索引扫描,插入记录,更新记录。

sqlora的专栏 648

PostgreSQL 17+ 关键基础监控指标详解

一文详解postgres数据库需要关注的指标,将指标按致命→严重→警告三级分类重新组织,便于分层制定告警策略和响应SLA。WAL无法写入,触发PANIC: could not write to file,实例立即崩溃。非活跃复制槽无限保留WAL,间接导致磁盘100%崩溃。阻塞VACUUM清理,加速XID年龄增长,引发表膨胀。缓存不足导致磁盘I/O压力增大,查询性能下降。WAL保留>10GB严重,>50GB致命。排序/哈希溢出磁盘,消耗空间并增加I/O。I/O等待飙升,查询延迟大幅增加。

zm_tree的博客 579

pgMonitor配置指南:自定义PostgreSQL性能指标与告警规则

pgMonitor是由Crunchy Data提供的PostgreSQL监控解决方案,集成了指标收集、性能分析和告警通知功能,帮助数据库管理员实时掌握PostgreSQL集群的运行状态。本文将详细介绍如何通过简单配置实现PostgreSQL性能指标的自定义采集与告警规则的灵活设置,让你轻松构建专业的数据库监控系统。 ## pgMonitor架构解析:核心组件与工作流程 📊 pgMonitor

gitblog_00262的博客 319

【PostgreSQL的指标采集工具--pgmetrics】

pgmetrics是用go语言写的一款PostgreSQL的健康监控指标采集软件。可以连接到数据库,获取当前数据库的相关信息,如果连接的是本地数据库,则同时会采集服务器的状态信息。可以把采集的结果以json或者text或者csv的形式存储。

小怪兽的博客 669
上一篇: 稳居榜首 !PostgreSQL连续第二年成为最受欢迎的数据库!
下一篇: 版本发布 | IvorySQL 3.4 发版
IvorySQL
博客等级 码龄5年 745粉丝 565原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值