1. 引言
PostgreSQL 是一款功能强大的开源关系型数据库,广泛应用于各类企业级应用。在高并发场景下,数据库连接池的管理和监控至关重要。如果连接池使用不当,可能会导致连接泄漏、阻塞甚至数据库崩溃。本文将详细介绍如何使用 pg_stat_activity
监控 PostgreSQL 连接状态,并针对连接卡住、阻塞等问题提供解决方案。
2. 使用 pg_stat_activity 监控连接状态
pg_stat_activity
是 PostgreSQL 提供的系统视图,用于查看当前所有数据库连接的状态信息。通过它,我们可以分析哪些连接正在执行查询、哪些连接处于空闲状态,以及是否存在长时间运行的 SQL 导致阻塞。
2.1 查看当前所有活动连接
SELECT * FROM pg_stat_activity;
返回的字段包括:
pid
:进程 IDusename
:用户名application_name
:客户端应用名称state
:连接状态(active
、idle
、idle 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 <