首页 89游戏攻略 正文

oracle查询连接数怎么看?学会这几种方法轻松搞定!

说起来,这管理数据库,尤其是Oracle,有时候跟看孩子似的,你得时不时瞅一眼它是不是乖乖的,是不是哪儿不对劲了。最常遇到的一个事儿,就是系统突然就慢下来了,或者说应用那边老抱怨连不上,这时候我的第一反应就是去查查,是不是数据库的连接数爆了,或者说,到底有多少人在用它。

本站为89游戏官网游戏攻略分站,89游戏每日更新热门游戏,下载请前往主站地址:www.gm89.icu

刚开始那会儿,我真是两眼一抹黑,啥也不知道,就知道去瞎捣鼓。比如系统一卡,我就跑到机房看看服务器灯亮不亮,问问开发是不是程序写错了。但这些都是治标不治本,或者说根本没找到问题核心。

后来被逼急了,才开始吭哧吭哧地自己钻研。最先学到的一招,也是最简单直接的,就是去数据库里那个叫 v$session 的表里瞅瞅。这个表,就像是个花名册,记录了所有连进数据库的会话信息。

我最早学到就是这个,敲一行SQL上去:

SELECT COUNT() FROM v$session;

当时看到结果出来一个数字,心里就“咯噔”一下。比如平时也就几百个,突然给你冒出来一两千,那肯定是有问题。这就好像是看有多少人挤在一个屋子里,人太多了,肯定喘不过气来。这招虽然粗暴,但管用,至少能给我个大概的数,知道是不是连接数太多了。

不过光知道个数还不行,我得知道这些连接都是谁发起的,干啥去了。不然光看个总数,我还是不知道谁是罪魁祸首。那时候我就想,这 v$session 表里头肯定还有别的宝贝。

于是我又开始扒拉资料,东问西问,慢慢就摸索出来,这个表里有很多有用的字段。比如 username 就能告诉我哪个用户连进来的,program 就能看出来是哪个程序或者应用连进来的,machineterminal 就能知道是从哪台机器连的。

我把查询语句升级了一下,变成了这样:

SELECT

username,

program,

machine,

COUNT() AS connection_count

FROM

v$session

GROUP BY

username,

program,

machine

ORDER BY

connection_count DESC;

这一查,好家伙,立刻就明明白白了。哪个应用占的连接最多,哪个用户连的最多,从哪台机器过来的,一清二楚。有时候能看到某个开发的测试程序开了几百个连接不释放,或者某个批处理任务写得有问题,瞬间就找到问题点了。有了这个详细列表,我就能直接去找对应的人,跟他们讲:“你这儿连接数有点多,看看是不是哪里没关”

但这还没完,有时候虽然连接数看着正常,但系统还是很慢。这时候我就得考虑是不是有很多连接是“死”的,或者说,是“挂”在那儿没干活的。这时候,我就又学了一招,看连接的状态。

v$session 表里头,有个叫 status 的字段,它能告诉我这个连接是 ACTIVE 也就是正在干活,还是 INACTIVE 也就是闲置着。所以我又改了下我的查询:

SELECT

status,

COUNT() AS status_count

FROM

v$session

GROUP BY

status;

这么一统计,我就能知道有多少连接是活的,有多少是死的。如果发现 INACTIVE 的连接一大堆,那可能就是应用那边连接池没设置或者程序没及时释放连接。这时候,虽然它们不占CPU,但是占着资源,堆多了也会让数据库喘不过气来。

还有一种情况,更特殊一点,就是我不仅想看谁在连接,我还想看这些连接到底在跑什么SQL语句。这就要更深入一点了。我通常会结合 v$sessionv$sql 这两个表一起来看。

SELECT




*_text

FROM

v$session s,

v$sql q

WHERE

*_id = *_id

AND * = 'ACTIVE'

AND * IS NOT NULL;

这个就厉害了,直接把那些正在“活蹦乱跳”的连接,它们正在执行的SQL语句都给扒出来了。一看到那些跑了半天还没结束的复杂查询,或者一些明显写得有问题的SQL,我就知道要从哪个方向去优化了。

这些都是我在实践中一点点摸索出来的。从一开始的不知所措,到后来能快速定位问题,中间踩了不少坑,也学到了不少东西。现在基本上遇到连接数的问题,我都是这几板斧下去,基本都能把问题搞定。感觉就像是以前开盲盒,现在终于知道怎么打开,还知道里面有什么了。