查SQL有多少个连接,最可靠的做法是先登录数据库执行系统视图或状态命令,再结合云监控或操作系统命令交叉验证。 不同数据库的查询语句不一样,权限也不一样,先确认数据库类型,再看当前连接、活跃连接和最大连接数,排查时还要按用户、客户端IP和数据库分组。
先把“连接数”说清楚:当前会话、活跃会话和上限不是一回事
当前连接数不等于正在干活的连接数
数据库里的“连接”通常指会话,连接建立后可能空闲,也可能正在执行SQL,很多现场问题不是连接总数高,而是活跃连接、长事务或慢查询把连接池占住了,看连接数时至少分三层:
- 当前连接数:数据库服务器当前接受的客户端会话数量。
- 活跃连接数:正在执行语句或处于事务中的会话数量。
- 最大连接数:数据库参数或实例规格允许的上限。
从数据库内部查最准,从操作系统查可交叉验证
数据库内部视图能看到登录名、客户端地址、程序名和状态,适合定位来源,操作系统命令能看网络连接,适合验证“应用服务器到数据库端口”的建连情况,两层结合,才不容易把连接池空闲连接误判为异常。
不同数据库怎么查连接数:命令和操作路径
SQL Server怎么查看当前连接数
登录SQL Server Management Studio,打开查询窗口,先看用户会话总数:
SELECT COUNT() AS user_sessions FROM sys.dm_exec_sessions WHERE is_user_process = 1;
再看连接明细和来源:
SELECT session_id, login_name, host_name, program_name, status FROM sys.dm_exec_sessions WHERE is_user_process = 1;
按数据库分组可用:
SELECT DB_NAME(database_id) AS db_name, COUNT() AS sessions FROM sys.dm_exec_sessions WHERE is_user_process = 1 GROUP BY database_id;
sp_who2也能快速看会话,查最大连接配置可执行SELECT @@MAX_CONNECTIONS;,据微软官方文档,sys.dm_exec_sessions适合查看用户会话,sys.dm_exec_connections更偏向连接层信息。
MySQL如何查询有多少个客户端连接
MySQL常用两条路,第一条看状态变量:
SHOW STATUS LIKE 'Threads_connected'; SHOW STATUS LIKE 'Threads_running';
Threads_connected是当前打开连接数,Threads_running是活跃线程数,第二条查连接明细:
SELECT COUNT() FROM information_schema.PROCESSLIST; SELECT user, host, db, command, time, state FROM information_schema.PROCESSLIST WHERE user <> 'system user';
按用户和来源分组更利于排查:
SELECT user, host, COUNT() AS conn_cnt FROM information_schema.PROCESSLIST GROUP BY user, host ORDER BY conn_cnt DESC;
最大连接数用SHOW VARIABLES LIKE 'max_connections';,据MySQL官方文档,information_schema.PROCESSLIST提供当前连接信息,SHOW PROCESSLIST也能看,但字段展示略有差异。
PostgreSQL和Oracle的常用查法
PostgreSQL查总数:
SELECT COUNT() FROM pg_stat_activity;
看非空闲连接:
SELECT COUNT() FROM pg_stat_activity WHERE state <> 'idle';
按用户和客户端地址分组:
SELECT usename, client_addr, state, COUNT() FROM pg_stat_activity GROUP BY usename, client_addr, state;
上限用SHOW max_connections;,据PostgreSQL官方文档,pg_stat_activity可查看客户端地址、应用名和状态。
Oracle常用:
SELECT COUNT() FROM v$session WHERE type = 'USER'; SELECT username, status, COUNT() FROM v$session GROUP BY username, status;
参数可查v$parameter中的sessions或processes,不同版本和权限下,视图可见范围不同。
| 数据库 | 常用命令/视图 | 适合看什么 | 注意点 |
|---|---|---|---|
| SQL Server | sys.dm_exec_sessions、sp_who2 |
用户会话、登录名、主机名 | 过滤is_user_process=1 |
| MySQL | Threads_connected、PROCESSLIST |
当前连接、用户、来源 | 区分总连接和活跃线程 |
| PostgreSQL | pg_stat_activity |
客户端地址、状态、应用名 | 需要相应视图权限 |
| Oracle | v$session |
用户会话、状态 | 权限和版本差异明显 |
云数据库和本地服务器怎么查:场景差异与工具选择
云数据库连接数监控和本地服务器有什么区别
云数据库一般能在控制台看连接数指标,还能配置告警,优点是省去自建监控,缺点是控制台指标有采集周期,瞬时尖峰可能被平滑,本地服务器更依赖自建监控,比如Prometheus加导出器,或者用脚本定时采集,行业共识认为,排查连接突增要先把应用连接池、慢查询、长事务和网络重连放在一条链上看,单看数据库总数容易误判。
免费查看SQL连接数的工具哪个好
临时排查,数据库自带命令和云监控免费指标足够用,需要历史趋势和多实例聚合时,再考虑付费APM或数据库可观测平台,免费工具胜在零成本、命令直接;付费工具胜在告警、留存和关联分析,小团队不必一上来堆工具,先把库内查询和监控告警跑通更实际。
从操作系统侧验证,可在数据库服务器或应用服务器执行:
ss -tn state established '( dport = :3306 or sport = :3306 )' | wc -l
SQL Server端口换成1433,PostgreSQL换成5432,若数据库前面有负载均衡、NAT或连接池中间件,系统层统计和库内会话数可能对不上,这属于正常现象。
连接数异常时怎么定位:从总量到来源
按用户、客户端IP、数据库分组
不要只查一个总数,先按用户分组,看是不是某个应用账号暴涨;再按客户端IP分组,看是否集中在少数应用服务器;最后按数据库分组,看是否某个库把连接占满,MySQL可按user, host分组,SQL Server可按login_name, host_name分组,PostgreSQL可按usename, client_addr分组。
北京机房SQL连接数异常怎么排查
北京机房出现连接数告警时,先确认是数据库实例维度还是某个库维度,接着在库内按客户端IP排序,定位应用服务器;再到对应应用服务器用ss看目标端口连接数;然后检查连接池最大池大小、空闲超时、泄漏检测和重连日志,若前面有NAT,客户端IP可能被转换,需要结合负载均衡日志看真实来源,业内专家指出,连接数不是越高越好,连接池上限要和数据库实例规格、业务并发匹配,盲目调大参数可能把压力推到数据库侧。
收束:先库内查,再外部验证
先确认数据库类型,再查当前会话和上限,最后用云监控或系统命令看来源和趋势。 这套顺序能回答多数“怎么查SQL有多少个连接服务器”的现场问题。
怎么查SQL有多少个连接服务器:高频问答
查SQL连接数需要什么权限?
MySQL通常需要PROCESS权限才能看全部会话;SQL Server需要查看DMV的权限;PostgreSQL需要能查询pg_stat_activity;Oracle需要相应视图权限,权限不足时只能看到当前用户会话,数量会偏小。
连接数接近上限怎么办?
先看活跃连接和空闲连接比例,空闲连接多,优先查连接池配置和回收策略;活跃连接多,查慢查询、长事务和锁等待,临时扩容或调大上限只能缓解,不能替代来源定位。
为什么数据库显示连接数和应用连接池对不上?
数据库统计的是服务器端会话,应用连接池统计的是客户端池内连接,中间可能有负载均衡、代理、连接复用和采集时间差,数据库内系统视图和状态命令是基准,应用连接池和操作系统统计只作交叉验证。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/786796.html


