分享

解决Oracle 11gR2 空闲连接过多,导致连接数满的问题

 鸿枫nh 2016-03-22

转自:http://blog./28998293/viewspace-1153969/ (有修改)
今天又遇到了11gR2连接数满的问题,以前也遇到过,因为应用那边没有深入检查,没有找到具体原因,暂且认为是这个版本Oracle的BUG吧。
上次的处理办法是用Shell脚本定时在系统中kill  v$session.status='INACTIVE'的连接,但是这次现场没有在操作系统中部署脚本的权限,只好在数据库中做处理,幸好我们对这个数据库有完全的权限。这次使用了profile+JOB定时alter system kill 'sid,seral#' immediate的方式。具体脚本如下:

  1. grant select on v_$session to TEST_USER;    --(解决v$session表或视图不存在)
  2. 给用户TEST_USER系统权限alter system;

  3. CREATE PROFILE KILLIDLE LIMIT IDLE_TIME 30;
  4. SELECT * FROM dba_profiles WHERE PROFILE='KILLIDLE';
  5. ALTER USER TEST_USER PROFILE KILLIDLE;
  6. SELECT username,PROFILE FROM dba_users WHERE username='TEST_USER';
  7. ALTER SYSTEM SET resource_limit=TRUE;

  8. CREATE OR REPLACE PROCEDURE sp_kill_idlesession
  9. /**********************************
  10. 清除idle超时的会话进程
  11. **********************************/
  12. AS
  13. CURSOR c_kill_sqls
  14. IS SELECT 'alter system kill session '''||s.sid||','||s.SERIAL#||''' immediate' sqlstr FROM v$session s WHERE s.STATUS='SNIPED';
  15. BEGIN
  16. FOR v_sql IN c_kill_sqls
  17.   LOOP
  18.     EXECUTE IMMEDIATE v_sql.sqlstr;
  19.   END LOOP;
  20. END;

  21. --添加JOB,定时清理过期会话
  22. DECLARE jobnum NUMBER :=661;
  23. BEGIN
  24.   dbms_job.submit(job => jobnum,
  25.                   what => 'sp_kill_idlesession;',
  26.                   next_date => to_date('30-04-2014 18:00:00', 'dd-mm-yyyy hh24:mi:ss'),
  27.                   interval => 'SYSDATE + 1/144');
  28.   commit;
  29. END;

  30. --如果30分钟过期时间太短,对数据库访问性能产生了影响,可以调整
  31. ALTER PROFILE KILLIDLE LIMIT IDLE_TIME 30;  

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多