SELECT
datname AS database_name,
usename AS user_name,
client_addr AS client_ip,
client_port,
state,
backend_start,
query_start,
query
FROM
pg_stat_activity
WHERE
client_addr IS NOT NULL;
-- 加 IS NOT NULL 是为了过滤掉数据库内部的后台服务进程,只看外部连接
核心字段说明:
database_name (datname): 当前连接的具体是哪个数据库。
user_name (usename): 登录使用的数据库账号。
client_ip (client_addr): 客户端的真实 IP 地址。
state: 连接的当前状态。常见的有:
active: 正在积极执行 SQL 查询。
idle: 空闲状态(连接连着,但当前没发任务,很多连接池里的连接都是这个状态)。
idle in transaction: 事务中空闲(需要警惕,如果长时间处于此状态可能会锁表)。
query: 该连接最后执行或正在执行的 SQL 语句。
实用进阶查询
如果您想重点排查某个IP的连接情况,可以使用以下两个变体:
1. 统计每个 IP 当前的连接数量
这可以帮您快速看清是不是某个IP建立了异常多的连接:
SELECT
client_addr AS client_ip,
COUNT(*) AS connection_count
FROM
pg_stat_activity
WHERE
client_addr IS NOT NULL
GROUP BY
client_addr
ORDER BY
connection_count DESC;
2. 精准追踪特定 IP
如果您查到了具体 IP(假设是 172.16.x.x),您可以直接把它代入进去,看它到底连没连上,以及在干什么:
SELECT
usename, state, query_start, query
FROM
pg_stat_activity
WHERE
client_addr = '172.16.x.x';