`
lknh
  • 浏览: 25409 次
  • 性别: Icon_minigender_1
  • 来自: 广西
社区版块
存档分类
最新评论

存储过程批量删除inactive session

阅读更多

在系统使用的过程中,数据库会出现很多inactive的session,占用服务器的资源,而这些session很多都是由于客户端以不正常的方式断开或者突然的断网产生的,如果清理掉必将会影响到数据库服务器的性能。我们可以通过select * from v$session WHERE status='INACTIVE' 来查看当前处在inactive 状态的sesion,然后将sid和serial#带入以下语句中将相应的session 杀死。

 alter system kill session 'sid,serial#' immediate;

然而,如果要大量的删除,以上的方法就会显得十分的繁琐,所以考虑通过存储过程来批量的删除,方法如下所示:

create or replace procedure KILL_INACTIVE_SESSIONS authid current_user is

  s VARCHAR2(1000);

  begin

  FOR sess IN (select SID, SERIAL# from v$session s

  where status='INACTIVE' 

        and (program='lg_server.exe' or program='JDBC Thin Client') 

        AND TYPE != 'BACKGROUND' and last_call_et>5000) 

        LOOP

  s := 'alter system kill session '''||sess.sid||','||sess.serial# ||'''immediate ' ;

  EXECUTE IMMEDIATE s;

  END LOOP;

end KILL_INACTIVE_SESSIONS;

 

需要注意的是,在存储过程中要查看系统的视图v$session时必须要给当前的用户授权,否则系统会提示找不到表或视图的错误,语句为:

grant select on v$session to current_user;

同样的在执行kill session 语句时用户需要有alter system的权限,否则会提示权限不足,而给随便给用户授权alter system又是不太严谨的,这个问题我们可以在创建语句中加入authid current_user解决这个问题

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics