情景描述:
某数据库 local_77用户,没开几个窗口就报超过窗口限制,询问dba是否改过:
解决思路:
1 查看该用户窗口限制,查到是该用户可开20个窗口。
与聊天中开几个窗口情况不符。
2 换了个思路,猜想因为达到了系统登录的最大数。
最大session为7500,存在的session 为2352 ,完全没有达到
3 再次换个方向,看了下该用户下已经存在了20个session,达到上限了,看了下status,发现有11个是 SNIPED ,由于闲置时间太久引起;百度了下解决方案。可以杀掉 数据库进程,再杀掉对应的OS进程。
4 执行下面语句:
select s.inst_id,s.sid, s.serial#,s.username,p.spid
from gv$session s,gv$process p
where s.username='LOCAL_77' and s.status='SNIPED' and
s.paddr=p.addr;
5 alter system kill session 'sid,serial#'; 再 kill -9 SPID 这样就完美解决了。
###########################################################
以上是完美情况,但是在做第五步的时候,犯了两个错误,
1、我把
s.paddr=p.addr;写成了s.sid=p.pid ,还真的有查询结果,并且我按照如此的SPID杀了进程,后来反应过来了,立马和相关人员说明了情况,索性没造成什么严重影响。
2、再犯第一个错误之后,我执行了正确的查询条件,并找到4个SNIPED的session,成功删了4个并释放了资源。但是其他的7个没有删掉正确的SPID,所以资源没有释放,通过下列语句找到相关的spid:
select /*+ rule */ spid from v$process where addr IN
(select addr from v$process where pid <> 1
minus
select paddr from v$session)
--括号里表示v$process 比v$session 中多的地址
minus
--minus 前的表示找到括号中的 os进程id
select spid from v$px_process
---减去并行的porcess 的OS进程id
--总的意思是找到 杀了数据库进程,但是没有杀对应的os进程id。搜索出的结果是可以杀的OS 进程id。
--因为 会话杀了以后,v$session中的paddr地址会变,与v$process不一致,所以你根据v$session中的paddr去v$process中找不到spid了,而OS 进程id是不变的。
杀掉os id就好;
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/31404823/viewspace-2129083/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/31404823/viewspace-2129083/