温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

对于会话sniped和inactive的理解,一边设置idle_time和sqlnet.expired_time

发布时间:2020-08-15 01:09:16 来源:ITPUB博客 阅读:223 作者:数据小魏 栏目:关系型数据库



1、什么是SNIPED会话?

     当一个会话是INACTIVE的,且INACTIVE的时长超过了某个限制,比如PROFILE中指定的IDLE_TIME时,这个会话的状态就会从INACTIVE变为SINPED。

     以你的例子来说,就是当一个非活动会话的空闲时间超过了360分钟,该会话的状态就会变为SNIPED。而不是360分钟后清理掉SNIPED的会话。


2、SNIPED会话何时被清理?

     当被标记为SNIPED的会话的客户端再次发出SQL语句时,客户端会收到错误提示,比如ORA-02396: exceeded maximum idle time, please connect again。这时,数据库才会彻底清理掉该会话及操作系统上的连接。

     但这样一来,意味着如果客户端不发出SQL,则不能清理掉的SNIPED的会话及其使用的连接,它们仍然会占用着资源,这可能引起资源不足的报错,比如连接数达到最大的问题。这时,就需要手工来清理这些SINPED会话及其所使用的连接。


3、手工清理SNIPED会话的脚本


查询状态为SNIPED的spid的命令:

SELECT P.SPID from V$PROCESS P,V$SESSION S

WHERE S.PADDR=P.ADDR

and s.STATUS = 'SNIPED';


查询状态为SNIPED 或 INACTIVE 的spid的命令:

SELECT P.SPID from V$PROCESS P,V$SESSION S

WHERE S.PADDR=P.ADDR

and s.STATUS in  ('SNIPED','INACTIVE');


查询上述两种状态,并定位用户:

SELECT P.SPID from V$PROCESS P,V$SESSION S

WHERE S.PADDR=P.ADDR

and S.STATUS = 'SNIPED'

and S.USERNAME = 'TTT';


脚本内容:

snfile=/tmp/tmp.txt

sqlplus system/oracle <<EOF

spool $snfile

@/home/oracle/123.sql

spool off

exit;

EOF

for x in `cat /tmp/tmp.txt | grep "^[0123456789]"`

do

kill -9 $x

done

rm /tmp/tmp.txt


当你的数据库连接方式为共享连接时,要小心不要把分配器进程或共享服务器进程也一并杀掉了。

对于10.2版本以上的数据库且是专用连接方式的,ORACLE推荐使用:

ALTER SYSTEM DISCONNECT SESSION '<SID>,<SERIAL>' IMMEDIATE 来清理。



4、在sqlnet.ora中配置SQLNET.EXPIRE_TIME=xxx,就是启用了DCD功能。其工作原理是当连接建立后,每隔XXX分钟,就由服务器端发送一个探测包到客户端,如果收到错误信息,就标记该连接并通知操作系统释放连接,回收资源。




向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI