Oracle存储过程批量删除Session

     首先,我要申明我之所以写这篇博客是因为今天看来篇博文http://chenzone.iteye.com/blog/2018199,原作者写的很好,只是排版欠缺,我在他的基础上把内容写清晰点,首先,带上我参考的博文链接:

    

http://chenzone.iteye.com/blog/2018199
http://www.jb51.net/article/20823.htm
http://dbajun.iteye.com/blog/135331
http://blog.itpub.net/633084/viewspace-1027933/
http://www.linuxidc.com/Linux/2012-10/72953.htm

    下面开始:

     一开始,我按原作者写的,创建存储过程,报错了,没有权限,而是想使用sysdba赋予权限。

   

    一登录,我发现 sysdba身份是SYS,以前自己一直在尝试使用sys登录,原来sysdba就是sys。

    查看当前用户:

   

show user

 

    那还有一个什么system呢?说实话system密码我也不知道,所以要使用sysdba修改system密码:

   

ALTER USER SYSTEM IDENTIFIED BY root

    如下:

   

    那么sys和system有何区别呢?

    简单说,SYS用户是Oracle中权限最高的用户,而SYSTEM是一个用于数据库管理的用户,平常一般用该帐号管理数据库就可以了。

    使用system登录,测试修改是否成功。

   

    然后给用户赋予查看v$session的权限。

   

    权限不足,那system又有那些权限呢?

    system用户的系统权限如下:

   

SQL> col privilege for a20;
SQL> select privilege from dba_sys_privs where grantee='SYSTEM';

   

    system用户角色权限为;

    

select privilege from dba_sys_privs where grantee in (select granted_role from dba_role_privs where grantee='SYSTEM')

    应该是system用户权限不足,换成sysdba试下,使用sysdba赋予权限。

   

    sysdba也没权限?其实,对于这种动态v$session,系统有一个相对应表,查看相对的表名是什么,赋予权限后就可以了,如下:

   

select synonym_name,table_name from dba_synonyms where synonym_name='V$SESSION';

   

    赋予用户v_$session查看权限就OK了。

   

 grant select on v_$session to tmd;

  

    那如何撤销权限呢?

   

 revoke select on v_$session from tmd;

  

    原来system对象搞错了,切换system赋予v_$session权限试下:

  

    还是没权限,所以只能使用sysdba赋予权限了。

    然后,新建存储过程:

   

create or replace procedure proc_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 proc_KILL_INACTIVE_SESSIONS;

    测试如下:

   

begin
  -- Call the procedure
  proc_kill_inactive_sessions;
end;

    该存储过程原理是:

   

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

    终于写完了,补充下,我的数据库是oracle 10g的。

    下面啰嗦句,其实很多作者博文内容很好,这是排版欠缺,导致很多人不想看,以为内容低下,这里我要感谢原作者,关于v$session对应v_$session表我今天才知道。

    世有伯乐,然后有千里马,这是我一开始想到的,我意思是伯乐难求,作为千里马也得自己争取,希望各位以后写博客时候注意排版,不求很漂亮,但求内容清晰,能看懂,谢谢。

   全文完。

 

   

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值