当前位置: 首页 > news >正文

PostgreSQL 中的 ‘pg_stat_activity‘ 系统视图详解

本篇对PostgreSQL 中的pg_stat_activity系统视图进行一个非常详细和深入的讲解,并介绍其核心应用场景。

一、pg_stat_activity 是什么?

pg_stat_activity是 PostgreSQL 的一个系统视图(System View),它提供了对当前数据库服务器上所有正在运行的服务器进程的一瞥。每个连接到 PostgreSQL 服务器的客户端(包括后台进程)都会在其中对应一条记录。

你可以把它看作是数据库的“任务管理器”“活动监视器”,是进行数据库监控、性能分析和故障排查的最重要工具之一。


二、视图字段详解(核心列说明)

查询SELECT * FROM pg_stat_activity;会返回很多列。以下是其中最常用和关键的列:

字段名数据类型描述
datidOid进程所连接的数据库的 OID。
datnamename进程所连接的数据库名。这是最常用的过滤字段。
pidinteger进程 ID。这是操作系统级别的进程 ID,是操作(如取消查询)的关键。
usesysidOid登录用户的 OID。
usenamename登录到此后端的用户名
application_nametext应用程序名称。由客户端连接字符串中的application_name参数设置。常用于识别不同来源的连接(如“psql”, “pgAdmin”, “my_app_server_1”)。
client_addrinet客户端的 IP 地址。如果通过 Unix domain socket 连接,则为 NULL。用于排查网络来源的问题。
client_hostnametext客户端的主机名(如果通过 IP 连接且启用了log_hostname)。
client_portinteger客户端用于通信的 TCP 端口号。
backend_starttimestamptz进程启动的时间(即客户端连接建立的时间)。
xact_starttimestamptz当前事务开始的时间。如果未在事务中,则为 NULL。
query_starttimestamptz当前正在执行的查询开始的时间
state_changetimestamptz上次state改变的时间。
wait_event_typetext进程正在等待的事件类型(如Lock,LWLock,BufferPin)。这是分析瓶颈的关键。如果进程正在运行,则为 NULL。
wait_eventtext等待事件的名称(如等待的锁类型)。与wait_event_type配合使用。
statetext当前后端的状态。这是极其重要的列:
-active: 后端正在执行一个查询。
-idle: 后端正在等待一个新的客户端命令。
-idle in transaction: 后端在一个事务中,但当前没有执行查询。
-idle in transaction (aborted): 后端在一个事务中,但事务中的一个语句出错了。
-fastpath function call: 后端正在执行一个 fast-path 函数。
-disabled: 如果 track_activities 被在这个后端禁用。
backend_xidxid后端的顶级事务 ID(如果存在)。
backend_xminxid后端的xmin水平线,用于判断哪些行版本对此后端可见。
querytext该进程最近执行的查询文本。如果stateactive,这就是当前正在运行的查询。如果track_activities被禁用,此值为 NULL。注意:超级用户可以看到所有查询,普通用户只能看到自己的查询。
query_idbigint用于计算查询频率的哈希码(需要compute_query_id = on)。

三、核心应用场景和查询示例

1. 查看所有活动连接(最基本用法)
SELECT*FROMpg_stat_activity;
2. 查看非空闲连接(聚焦正在工作的进程)

这是最常用的查询,过滤掉那些只是连着但没事干的连接。

SELECTdatname,usename,client_addr,application_name,state,query,query_start,now()-query_startASdurationFROMpg_stat_activityWHEREstate!='idle'ANDpid!=pg_backend_pid()-- 排除自己当前这个查询连接ORDERBYdurationDESC;
3. 查找长时间运行的查询/事务(用于排查性能问题)
-- 查找运行超过 5 分钟的查询SELECTpid,usename,datname,now()-query_startASquery_duration,queryFROMpg_stat_activityWHEREstate='active'ANDnow()-query_start>interval'5 minutes'ORDERBYquery_durationDESC;-- 查找开启时间过长的事务(即使它现在没在执行查询)SELECTpid,usename,datname,now()-xact_startASxact_duration,state,queryFROMpg_stat_activityWHERExact_startISNOTNULLANDnow()-xact_start>interval'10 minutes'ORDERBYxact_durationDESC;
4. 查找等待锁的进程(用于解决锁冲突)
SELECTpid,usename,datname,query,wait_event_type,wait_event,now()-query_startASwait_durationFROMpg_stat_activityWHEREwait_event_typeISNOTNULLANDwait_event_type='Lock'-- 聚焦在锁等待上ORDERBYwait_durationDESC;
5. 按应用或用户统计连接数
-- 按应用统计SELECTapplication_name,count(*)FROMpg_stat_activityGROUPBYapplication_name;-- 按用户统计SELECTusename,count(*)FROMpg_stat_activityGROUPBYusename;-- 按数据库统计SELECTdatname,count(*)FROMpg_stat_activityGROUPBYdatname;
6. 终止问题查询或连接(pg_terminate_backend

当你发现一个异常查询(如长时间运行、死锁)时,可以用获取到的pid来终止它。
警告:这是强制杀死操作,可能会中断业务,请谨慎使用。

-- 取消一个查询(类似于 Ctrl+C),允许它自行回滚SELECTpg_cancel_backend(pid);-- 强制终止一个后端连接(类似于 kill -9),连接会立即断开,事务会回滚SELECTpg_terminate_backend(pid);-- 示例:终止所有连接到 'my_database' 的连接(常用于维护前踢出所有用户)SELECTpg_terminate_backend(pid)FROMpg_stat_activityWHEREdatname='my_database';
7. 查找“僵尸”事务(Idle in Transaction)

这种状态的事务通常由应用程序bug引起(如开启了事务但未提交或回滚),它会持有锁、阻止VACUUM,是数据库的“大敌”。

SELECTpid,usename,datname,now()-xact_startASxact_duration,queryFROMpg_stat_activityWHEREstate='idle in transaction'ORDERBYxact_durationDESC;

四、重要注意事项和最佳实践

  1. 权限: 普通用户只能看到自己会话的信息。超级用户可以看到所有会话的信息和查询。
  2. query字段的性能pg_stat_activityquery字段是text类型,可能很长。在生产环境频繁查询所有字段(尤其是SELECT *)可能会对性能有轻微影响。建议只选择你需要的列。
  3. pg_backend_pid(): 在编写管理脚本时,使用WHERE pid <> pg_backend_pid()可以排除掉你当前用于查询的管理连接自身,避免误杀自己。
  4. 监控工具的基础: 几乎所有 PostgreSQL 监控工具(如 pgAdmin 的仪表盘、Zabbix、Prometheus + grafana 看板)其底层数据都来源于pg_stat_activitypg_stat_statements等系统视图。
  5. 结合其他视图: 为了更全面的分析,通常将pg_stat_activitypg_locks(查看锁详情)、pg_stat_statements(查看历史查询统计)等视图结合使用。

总之,pg_stat_activity是 PostgreSQL DBA 和开发者必须掌握的核心工具,熟练使用它能让你快速诊断数据库的实时状态、定位性能瓶颈和解决各种连接与锁相关问题。

http://www.jsqmd.com/news/1399398/

相关文章:

  • 微信聊天记录备份工具终极指南:用5张清单,从解密原理到长期保管一次讲透
  • Vue Chrome Extension Template架构详解:深入理解插件开发的底层逻辑
  • 米哈游扫码登录完整指南:用 MHY_Scanner 让直播画面里的二维码自动完成验证
  • 洛雪音乐音源怎么用?30分钟配置免费无损音乐完整指南
  • 零API密钥免费视频制作实战:OpenMontage让新手30分钟做出第一支片
  • 一物一码系统哪家适合快消?2026品牌方选型指南 - 满满品牌智选
  • 宝安回收空心古法黄金,小商家随意加收空心损耗费!本地卖金避雷指南 - 路人老杨实测
  • OpenClaw:基于AI Agent的智能化测试框架实战解析
  • OpenProject开源项目管理完整指南:免费自托管部署与团队协作上手指南
  • 终极Unity许可证验证绕过指南:UniHacker 一键破解全版本,Windows、Mac、Linux 零成本起步
  • 洛雪音乐音源保姆级指南:如何免费听遍全网无损音乐
  • 2026年探访赣州兴国天美源头厂,高品质家具直供到底有何不同? - 滚动商讯
  • HDPE 塑料排水板甄选源头厂家 - 排水板厂家
  • 三步搭好第一套Build:Path of Building离线规划工具新手实操指南
  • 2026年8月综合盘点:惠山区靠谱轮胎服务商家推荐 - 滚动商讯
  • Ghidra 逆向工程框架完全指南:从安装调试到 Python 自动化
  • 洛雪音乐音源免费配置终极指南:先看成绩单,再抄作业
  • 成都犬舍推荐:成都有哪些靠谱犬舍? - 四川同城宠物观察
  • 免费PDF工具箱PDF补丁丁:三步解决书签、页面、图片处理的全部难题
  • 2026保山防水补漏全解析|雨季、回南天、山潮房屋渗漏修缮实用指南 - 筑宅安
  • 开源ERP系统怎么选?ERPNext用一整套免费方案回答你
  • 微信防撤回工具 RevokeMsgPatcher:让“撤回“从此只是摆设
  • 深圳黄金回收避坑|认准水贝连锁实体店,拒绝虚高报价套路 - 朝夕热点速报
  • 如何使用Playlistor快速转换跨平台播放列表?5分钟入门教程
  • PDF补丁丁完整指南:免费开源PDF工具箱,书签编辑与批量处理一站搞定
  • 嘉兴小白学糕点去哪里好?推荐港焙国际培训学校 - 港焙西点-知美人美学
  • 车库顶板虹吸排水板5 家厂家综合甄选 - 排水板厂家
  • 2026实力解析:户外广告帐篷定制厂家/帐篷出口/大型帐篷生产厂家推荐 - 栗子测评
  • 2026西安黄金回收常见问题答疑|破解大众认知误区,告别卖金吃亏 - 朝夕热点速报
  • 2026年娄底新媒体运营推广服务商怎教你如何选择?服务边界、内容体系与AI搜索适配 - 中国品牌价值观察网