在系统使用的过程中,数据库会出现很多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解决这个问题