状态为sniped 的session处理

情景描述:
某数据库 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/

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值