首先,我要申明我之所以写这篇博客是因为今天看来篇博文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表我今天才知道。
世有伯乐,然后有千里马,这是我一开始想到的,我意思是伯乐难求,作为千里马也得自己争取,希望各位以后写博客时候注意排版,不求很漂亮,但求内容清晰,能看懂,谢谢。
全文完。