♣
题目部分
在Oracle中,如何定时清理INACTIVE状态的会话?
♣
答案部分
一般情况下,少量的INACTVIE会话对数据库并没有什么影响,但是,如果由于程序设计等某些原因导致数据库出现大量的会话长时间处于INACTIVE状态,那么将会导致大量的系统资源被消耗,造成会话数超过系统SESSION的最大值,出现ORA-00018:maximum number of sessions exceeded错误。此时就需要清理那些长时间处于INACTIVE状态的会话。人为定期检查、杀掉这类会话肯定不太现实,要定期清理那些长时间处于INACTIVE的会话,可以使用如下几种办法:
1. sqlnet.ora文件里加上sqlnet.expire_time,单位为分钟数。
2. 设置用户profile的IDLE_TIME参数,需要设置resource_limit为true,然后再设置IDLE_TIME参数,单位为分钟:
1alter system set resource_limit=true; 2alter profile default limit idle_time 10;
方法2需要和方法1结合使用。
3. 直接KILL掉INACTIVE的会话。V$SESSION视图中的LAST_CALL_ET字段表示用户最后一条语句执行完毕后到sysdate的时间,单位为秒。每次用户执行一个新的语句后,该字段复位为0,重新开始记数。可以通过该字段来获得一个连接用户最后一次操作数据库后的空闲时间。推荐使用这种方法来释放INACTIVE状态的会话。具体代码如下所示:
1set sqlblanklines on 2CREATE OR REPLACE PROCEDURE P_kill_session_LHR AS 3 ----------------------------------------------------------------------------------- 4 -- Created on 2013-06-25 12:05:07 by lhr 5 --Changed on 2015-08-05 12:05:07 by lhr 6 -- function: 杀掉10个小时之前的会话 ,告警日志中会记录被杀掉的会话信息 7 ----------------------------------------------------------------------------------- 8 9 BEGIN 10 11 -- IF to_char(SYSDATE, 'HH24') >= '20' OR 12 -- TO_CHAR(SYSDATE, 'HH24') <= '08' THEN 13 14 FOR cur IN (SELECT A.USERNAME, 15 A.LOGON_TIME, 16 A.STATUS, 17 A.SID, 18 A.SERIAL#, 19 A.MACHINE, 20 A.OSUSER, 21 'ALTER SYSTEM DISCONNECT SESSION ''' || a.SID || ',' || 22 a.serial# || ',@' || a.INST_ID || ''' IMMEDIATE' kill_session 23 FROM gv$session A 24 WHERE A.STATUS IN ('INACTIVE') 25 AND A.USERNAME IS NOT NULL 26 AND A.LAST_CALL_ET >= 60 * 60 * 10) LOOP 27 28 BEGIN 29 30 EXECUTE IMMEDIATE cur.kill_session; 31 EXCEPTION 32 WHEN OTHERS THEN 33 NULL; 34 END; 35 36 END LOOP; 37 38 -- END IF; 39 40 EXCEPTION 41 WHEN OTHERS THEN 42 NULL; 43 END P_kill_session_LHR; 44/ 45 46 47 48BEGIN 49 --DBMS_SCHEDULER.drop_job('JOB_P_kill_session_LHR'); 50 DBMS_SCHEDULER.CREATE_JOB(JOB_NAME => 'JOB_P_kill_session_LHR', 51 JOB_TYPE => 'STORED_PROCEDURE', 52 JOB_ACTION => 'P_kill_session_LHR', 53 repeat_interval => 'FREQ=MINUTELY;INTERVAL=60', 54 ENABLED => TRUE, 55 START_DATE => SYSDATE, 56 COMMENTS => '删除--每60分钟检查一次'); 57END; 58/
& 说明:
有关如何定时清理INACTIVE状态的会话的更多内容可以参考我的BLOG:http://blog.itpub.net/26736162/viewspace-2154547/
本文选自《Oracle程序员面试笔试宝典》,作者:小麦苗
详细内容可以添加麦老师微信或QQ私聊。
About Me:小麦苗
● 本文作者:小麦苗,只专注于数据库的技术,更注重技术的运用
● 作者博客地址:http://blog.itpub.net/26736162/abstract/1/
● 本系列题目来源于作者的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解
● 版权所有,欢迎分享本文,转载请保留出处
● QQ:646634621 QQ群:618766405
● 提供OCP、OCM和高可用部分最实用的技能培训
● 题目解答若有不当之处,还望各位朋友批评指正,共同进步
DBA宝典
长按下图识别二维码或微信扫描下图二维码来关注小麦苗的微信公众号:xiaomaimiaolhr,学习最实用的数据库技术。