导读:本期聚焦于BIT程序员创作的《什么是pg_stat_monitor?如何使用这个PostgreSQL增强监控扩展提升数据库可观测性?》,敬请观看详情。pg_stat_monitor是Percona推出的PostgreSQL查询性能监控扩展,可以看作是pg_stat_statements的增强版本。它不仅记录SQL语句的执行统计信息,还支持按时间_bucket_分桶存储、错误统计、查询计划收集、客户端IP追踪等pg_stat_statements不具备的能力。本文将介绍pg_stat_monitor的核心特性与工作原理,讲解编译安装、配置加载的完整步骤,并通过实际SQL演示如何查询慢查询、定位高频错误语句、分析时间维度的性能趋势,最后对比它与pg_stat_statements的差异,帮助你判断在生产环境中是否需要引入这款工具。

PostgreSQL自带的pg_stat_statements扩展一直是排查慢查询的主力工具,但它有几个明显的短板:统计数据是全局累计的,无法看到某个时间段内的查询表现;看不到查询的报错情况;也不知道查询来自哪个客户端IP。Percona开源的pg_stat_monitor扩展正是为了解决这些问题而设计的,它在pg_stat_statements的思路基础上做了大量增强,是PostgreSQL运维工具箱里非常值得一试的组件。

什么是pg_stat_monitor?如何使用这个PostgreSQL增强监控扩展提升数据库可观测性?

pg_stat_monitor的核心特性与工作原理

pg_stat_monitor本质上是一个PostgreSQL的extension,通过挂载共享内存中的统计数据结构,拦截数据库内核层的查询执行钩子来收集信息。每次查询执行完成后,相关信息会被归并到对应的bucket中。所谓bucket,是pg_stat_monitor引入的时间分桶机制:整个统计周期被划分为若干个固定长度的时间窗口,默认每分钟一个bucket,最多保留一定数量的bucket,超过后旧数据被清空,统计数据从零重新开始。

这个分桶机制带来一个质变:你可以回答“过去五分钟和上一个五分钟相比,查询耗时有没有恶化”这类问题,而pg_stat_statements只能告诉你自数据库启动以来的累计平均值。除了时间维度,pg_stat_monitor相比pg_stat_statements的主要增强还包括以下几点。

  • 错误统计:记录每个查询语句的错误次数、错误码以及返回的样本错误消息,方便快速定位频繁报错的SQL。
  • 客户端IP与主机名追踪:知道每条语句来自哪个应用服务器,多应用共用一个数据库时非常有用。
  • 查询计划收集:配合pg_stat_monitor的plan功能可以查看语句的实际执行计划。
  • 直方图统计:对调用耗时、CPU时间等提供桶状分布,直观看出耗时的长尾情况。
  • 应用名与用户名维度:统计数据可以按application_name区分来源。

在资源消耗方面,pg_stat_monitor因为记录的维度更多,占用的共享内存会比pg_stat_statements大一些,但正常配置下开销依然可控。需要注意的是它要求统计信息存放在共享内存中,bucket数量和bucket时长需要在postgresql.conf中预先配置好,修改后需要重启数据库才能生效。

安装、配置与启用步骤

pg_stat_monitor需要从源码编译安装,官方仓库提供了针对不同PostgreSQL大版本的分支,编译前务必确认版本匹配。以Linux环境为例,先确保系统安装了PostgreSQL的开发头文件,然后执行标准的三步编译。

git clone https://github.com/percona/pg_stat_monitor.git
cd pg_stat_monitor
# PG_CONFIG指向你实际的pg_config路径
make PG_CONFIG=/usr/pgsql-15/bin/pg_config
make PG_CONFIG=/usr/pgsql-15/bin/pg_config install

编译安装完成后,还需要修改postgresql.conf配置文件。pg_stat_monitor必须预加载到shared_preload_libraries中,这一点和pg_stat_statements一样,因为它需要在数据库启动时初始化共享内存结构。

# postgresql.conf
shared_preload_libraries = 'pg_stat_monitor'
pg_stat_monitor.pgsm_bucket_time = 60        # 每个bucket代表60秒
pg_stat_monitor.pgsm_max_buckets = 10        # 最多保留10个bucket
pg_stat_monitor.pgsm_track_plans = on        # 收集执行计划

配置保存后重启PostgreSQL服务,然后连接到目标数据库创建扩展即可。

CREATE EXTENSION pg_stat_monitor;
-- 查看视图是否可用
SELECT bucket_done, substr(query, 1, 40) AS query_text, calls, mean_exec_time
FROM pg_stat_monitor
ORDER BY mean_exec_time DESC
LIMIT 10;

这里有两个参数值得留意。pgsm_bucket_time决定单个时间窗口的粒度,粒度越小越能看到瞬时波动,但保留的历史也越短;pgsm_max_buckets决定保留多少个窗口。两者相乘就是可追溯的历史总时长,例如60秒乘以10个bucket就是最近十分钟的数据。生产环境中如果需要覆盖更长的时间跨度,可以适当调大bucket数量,但要注意内存占用会相应增长。

实战查询:定位慢查询与异常语句

安装完成后,pg_stat_monitor视图提供了几十个字段,常用的包括calls(调用次数)、mean_exec_time(平均执行耗时)、max_exec_time、total_exec_time、rows(返回或影响的行数)、client_ip、error_count等。排查慢查询最直接的方式就是按平均耗时或总耗时排序。

-- 找出当前bucket中平均耗时最高的10条语句
SELECT bucket_start_time,
       userid::regrole,
       substr(query, 1, 50) AS query_text,
       calls,
       round(mean_exec_time::numeric, 2) AS avg_ms,
       round(max_exec_time::numeric, 2) AS max_ms,
       client_ip
FROM pg_stat_monitor
ORDER BY mean_exec_time DESC
LIMIT 10;

错误排查是pg_stat_monitor的一个亮点场景。假设应用频繁报错但日志分散,可以通过error_count字段快速锁定问题SQL,还能拿到实际的错误消息样本。

-- 查询报错次数最多的语句
SELECT substr(query, 1, 50) AS query_text,
       calls,
       error_count,
       elevel,
       substr(message, 1, 60) AS error_message
FROM pg_stat_monitor
WHERE error_count > 0
ORDER BY error_count DESC;

做时间趋势分析时,可以利用bucket字段做分组聚合。比如比较最近几个时间窗口内某类查询的平均耗时变化,判断是否有性能劣化的趋势。此外还可以结合application_name字段,观察不同业务模块的数据库负载占比,这在多服务共用数据库的微服务架构下尤其有用。

-- 按时间桶观察查询耗时趋势
SELECT bucket,
       date_trunc('minute', bucket_start_time) AS window_start,
       calls,
       round(mean_exec_time::numeric, 2) AS avg_ms
FROM pg_stat_monitor
WHERE query ILIKE '%orders%'
ORDER BY bucket DESC;

与pg_stat_statements的对比及选型建议

两者的定位不同。pg_stat_statements胜在简单稳定,它是PostgreSQL官方contrib自带的扩展,几乎所有环境都能直接使用,累计统计的方式也符合容量规划类的分析需求。pg_stat_monitor则在可观测性维度上全面领先,时间分桶、错误追踪、IP归属、计划收集这些都是pg_stat_statements不具备的。

对比项pg_stat_statementspg_stat_monitor
统计方式全局累计时间bucket滚动
错误统计不支持支持,含错误码和消息样本
客户端IP不支持支持
执行计划不支持支持收集
安装方式官方自带需源码编译

选型上给出几点建议。如果你的场景是常规的慢查询治理,pg_stat_statements加上定期的日志分析已经够用,没必要引入额外复杂度。但如果你需要近实时的性能监控、错误SQL的快速定位、按时间维度观察趋势,或者正在搭建数据库监控平台,那么pg_stat_monitor提供的丰富维度能显著提升排障效率。它也可以和pg_stat_statements共存于同一个实例,两者各自独立统计,互不干扰,可以先小范围试用再决定是否全面铺开。无论选择哪种方案,都建议配合定期采集落表的外部脚本,把监控数据持久化下来,避免bucket滚动或重启后历史统计丢失,这样才能支撑更长时间跨度的性能回溯分析。

pg_stat_monitorPostgreSQL监控数据库性能优化修改时间:2026-09-12 10:54:40

免责声明:已尽一切努力确保本网站所含信息的准确性。网站作品多为原创整理与精心创作,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们进行处理Email:chomcom@qq.com。
引用或转载本作品时,请注明当前出处:https://www.ipipp.com/html/20260912/55286.html,基于非商业用途的前提下,欢迎转载或二创本作品。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。