PostgreSQL连接池监控与优化:pg_stat_activity详解及连接阻塞排查指南

1. 引言

PostgreSQL 是一款功能强大的开源关系型数据库,广泛应用于各类企业级应用。在高并发场景下,数据库连接池的管理和监控至关重要。如果连接池使用不当,可能会导致连接泄漏、阻塞甚至数据库崩溃。本文将详细介绍如何使用 pg_stat_activity 监控 PostgreSQL 连接状态,并针对连接卡住、阻塞等问题提供解决方案。


2. 使用 pg_stat_activity 监控连接状态

pg_stat_activity 是 PostgreSQL 提供的系统视图,用于查看当前所有数据库连接的状态信息。通过它,我们可以分析哪些连接正在执行查询、哪些连接处于空闲状态,以及是否存在长时间运行的 SQL 导致阻塞。

2.1 查看当前所有活动连接

SELECT * FROM pg_stat_activity;

返回的字段包括:

  • pid:进程 ID
  • usename:用户名
  • application_name:客户端应用名称
  • state:连接状态(activeidleidle in transaction 等)
  • query_start:查询开始时间
  • query:当前执行的 SQL(如果是 idle 状态则为空)

2.2 按状态统计连接数

SELECT state, count(*) 
FROM pg_stat_activity 
GROUP BY state 
ORDER BY count DESC;

常见状态:

  • active:正在执行查询
  • idle:连接已建立但空闲(未执行 SQL)
  • idle in transaction:事务已开始但未提交/回滚(可能导致锁等待)
  • idle in transaction (aborted):事务异常中止

2.3 检查连接是否接近上限

SELECT 
    (SELECT setting::int FROM pg_settings WHERE name = 'max_connections') AS max_conn,
    (SELECT <