健康一贴灵,专注医药行业管理信息化

查询 PostgreSQL 当前连接数的常用方法

以下是查询 PostgreSQL 当前连接数的常用方法,按场景分类整理:


🔹 方法 1:查询当前总连接数(最常用)

SELECT COUNT(*) AS current_connections 
FROM pg_stat_activity;

🔹 方法 2:按数据库分组统计连接数

SELECT 
    datname AS database_name,
    COUNT(*) AS connection_count
FROM pg_stat_activity
GROUP BY datname
ORDER BY connection_count DESC;

🔹 方法 3:按用户分组统计连接数

SELECT 
    usename AS username,
    COUNT(*) AS connection_count
FROM pg_stat_activity
GROUP BY usename
ORDER BY connection_count DESC;

🔹 方法 4:区分活跃/空闲连接

SELECT 
    state,
    COUNT(*) AS count
FROM pg_stat_activity
GROUP BY state
ORDER BY count DESC;
  • active:正在执行查询
  • idle:连接空闲(事务已结束)
  • idle in transaction:事务中但无操作(需警惕长事务)
  • idle in transaction (aborted):事务中发生错误

🔹 方法 5:查看连接上限及使用率

SELECT 
    current_setting('max_connections') AS max_connections,
    (SELECT COUNT(*) FROM pg_stat_activity) AS current_connections,
    ROUND(
        100.0 * (SELECT COUNT(*) FROM pg_stat_activity) 
        / current_setting('max_connections')::int,
        2
    ) AS usage_percent;

🔹 方法 6:命令行快速查看(psql)

# 总连接数
psql -c "SELECT COUNT(*) FROM pg_stat_activity;"

# 详细列表(含数据库、用户、状态)
psql -c "SELECT pid, usename, datname, state, query FROM pg_stat_activity;"

🔹 ⚠️ 注意事项

  1. 权限要求:普通用户只能看到自己的连接,需 pg_read_all_stats 角色或超级用户权限查看全部连接。
  2. 连接泄漏排查
    -- 查找空闲超过 10 分钟的连接(可能泄漏)
    SELECT pid, usename, datname, state, query_start,
           NOW() - query_start AS idle_time
    FROM pg_stat_activity
    WHERE state = 'idle' 
      AND NOW() - query_start > INTERVAL '10 minutes'
    ORDER BY idle_time DESC;
    
  3. 终止异常连接(谨慎操作):
    SELECT pg_terminate_backend(pid) 
    FROM pg_stat_activity 
    WHERE state = 'idle' 
      AND NOW() - query_start > INTERVAL '1 hour';
    

🔹 补充:监控建议

  • 将连接数监控纳入 Prometheus + Grafana(使用 pg_stat_activity 指标)
  • 设置告警阈值(如连接数 > max_connections * 0.8
  • 应用层使用连接池(如 PgBouncer)避免连接数耗尽

💡 您当前配置的 max_connections = 500(根据您上传的配置文件),建议日常使用保持在 70% 以下,预留应急空间。

posted @ 2026-02-05 17:02  一贴灵  阅读(90)  评论(0)    收藏  举报
学以致用,效率第一