• Oralce清理多余的session


    首先我们了解下,会话有那些状态:
    1、active
    此状态的会话,表示正在执行,处于活动状态。
    2、killed
    此状态的会话,被标注为删除,表示出现了错误,正在回滚,当然,也是占用系统资源的。还有一点就是,killed的状态一般会持续较长时间,而且用windows下的工具pl/sql developer来kill掉,是不管用的,要用命令:alter system kill session ‘sid,serial#’ ;
    3、inactive
    该状态处于等待操作(即等待需要执行的SQL语句),通常当DML语句已经完成。 但连接没有释放,这个可能是程序中没有释放,如果是使用中间件来连接的话,也可能是中间件的配置或者是bug 导致。
    4、SNIPED- Session inactive, waiting on the client
    其它说明:
    inactive对数据库本身没有什么影响,但是如果程序没有及时commit,那么就会造成占用过多会话。容易是DB 的session 达到极限值。
    他们的做法是不处理inactive 状态的session, 如果达到了session 的最大值, 就增加processes 和 sessions 参数。 如果kill inactive session 可能会到中间件有影响。
    下面讲怎么清除长时间的会话数:
    1、启动资源计划

    alter system set resource_limit=true scope=spfile;
    

    2、设置非活动回话十五分钟断开,释放资源

    alter profile default limit idle_time 15;

    1. 清楚非活动的进程 (没10分钟发送检测包)

    $ORACLE_HOME/network/admin 添加 SQLNET.EXPIRE_TIME=10;

    SELECT SID, SERIAL#,MODULE, STATUS
    FROM V$SESSION S
    WHERE S.USERNAME ISNOTNULL
    ANDUPPER(S.PROGRAM) IN ('TOAD.EXE', 'W3WP.EXE')
    AND S.LAST_CALL_ET >= 60*60*2
    AND S.STATUS = 'INACTIVE'
    ORDERBY SID DESC;
    --如果是RAC环境,那么最好使用下面SQL语句,使用全局视图GV$SESSION。
    SELECT SID, SERIAL#, INST_ID, MODULE,STATUS
    FROM gv$session S
    WHERE S.USERNAME ISNOTNULL
    ANDUPPER(S.PROGRAM) IN ('TOAD.EXE', 'W3WP.EXE')
    AND S.LAST_CALL_ET >= 2 * 60*60
    AND S.STATUS = 'INACTIVE'
    ORDERBY INST_ID DESC
    CREATE OR REPLACE PROCEDURE SYS.DB_KILL_IDLE_CLIENTS AUTHID DEFINER AS
        job_no number;
        num_of_kills number := 0;
     BEGIN   FOR REC IN
            (SELECT SID, SERIAL#, INST_ID, MODULE,STATUS
             FROM gv$session S
                 WHERE S.USERNAME IS NOT NULL
                 AND UPPER(S.PROGRAM) IN ('xxx', 'xxx.EXE')   
                      AND S.LAST_CALL_ET >= 2*60*60                              
                 AND S.STATUS= 'INACTIVE'
             ORDER BY INST_ID ASC
                 ) LOOP
              ---------------------------------------------------------------------------
              -- kill inactive sessions immediately
              ---------------------------------------------------------------------------
              DBMS_OUTPUT.PUT('LOCAL SID ' || rec.sid || '(' || rec.module || ')');
          execute immediate 'alter system kill session ''' || rec.sid || ', ' ||
                                 rec.serial# || '''immediate' ;
     
              DBMS_OUTPUT.PUT_LINE('. killed locally ' || job_no);
              num_of_kills := num_of_kills + 1;
        END LOOP;
        DBMS_OUTPUT.PUT_LINE ('Number of killed xxxx system sessions: ' || num_of_kills);
     END DB_KILL_IDLE_CLIENTS;
     /
     我们可以在作业(JOB)或Schedule里面定期调用该存储过程,也可以通过后台作业结合shell脚本实现定期清理空闲会话的功能。例如如下所示。
    
    创建killSession.sh脚本,调用该存储过程SYS.DB_KILL_IDLE_CLIENTS
    
    #!/bin/bash  
    
    logfile=/home/oracle/cron/session/log/killSession.log
    
    echo " " >> $logfile 2>&1
    
    echo "START ----`date`" >> $logfile 2>&1plus /nolog <<STATS
    
    connect / as sysdba
    
    exec sys.db_kill_idle_clients;
    
    exit;
    
    STATS

    echo "END ------`date`" >> $logfile 2>&1

      最后在系统任务中增加:

    在crontab里面配置后台作业,每隔15分钟运行一次,清理哪些满足条件的空闲会话。y

    0,15,30,45 * * * * /home/oracle/cron/session/bin/killSession.sh >/dev/null 2>&1


    原文链接:
    https://blog.csdn.net/xyl870419/article/details/232521505
    SELECT SID, SERIAL#,MODULE, STATUS
    FROM V$SESSION S
    WHERE S.USERNAME ISNOTNULL
    ANDUPPER(S.PROGRAM) IN ('TOAD.EXE', 'W3WP.EXE')
    AND S.LAST_CALL_ET >= 60*60*2
    AND S.STATUS = 'INACTIVE'
    ORDERBY SID DESC;
    --如果是RAC环境,那么最好使用下面SQL语句,使用全局视图GV$SESSIONSELECT SID, SERIAL#, INST_ID, MODULE,STATUS
    FROM gv$session S
    WHERE S.USERNAME ISNOTNULL
    ANDUPPER(S.PROGRAM) IN ('TOAD.EXE', 'W3WP.EXE')
    AND S.LAST_CALL_ET >= 2 * 60*60
    AND S.STATUS = 'INACTIVE'
    ORDERBY INST_ID DESC
    CREATE OR REPLACE PROCEDURE SYS.DB_KILL_IDLE_CLIENTS AUTHID DEFINER AS
        job_no number;
        num_of_kills number := 0;
     BEGIN   FOR REC IN
            (SELECT SID, SERIAL#, INST_ID, MODULE,STATUS
             FROM gv$session S
                 WHERE S.USERNAME IS NOT NULL
                 AND UPPER(S.PROGRAM) IN ('xxx', 'xxx.EXE')   
                      AND S.LAST_CALL_ET >= 2*60*60                              
                 AND S.STATUS= 'INACTIVE'
             ORDER BY INST_ID ASC
                 ) LOOP
              ---------------------------------------------------------------------------
              -- kill inactive sessions immediately
              ---------------------------------------------------------------------------
              DBMS_OUTPUT.PUT('LOCAL SID ' || rec.sid || '(' || rec.module || ')');
          execute immediate 'alter system kill session ''' || rec.sid || ', ' ||
                                 rec.serial# || '''immediate' ;
     
              DBMS_OUTPUT.PUT_LINE('. killed locally ' || job_no);
              num_of_kills := num_of_kills + 1;
        END LOOP;
        DBMS_OUTPUT.PUT_LINE ('Number of killed xxxx system sessions: ' || num_of_kills);
     END DB_KILL_IDLE_CLIENTS;
     /
     我们可以在作业(JOB)或Schedule里面定期调用该存储过程,也可以通过后台作业结合shell脚本实现定期清理空闲会话的功能。例如如下所示。
    
    创建killSession.sh脚本,调用该存储过程SYS.DB_KILL_IDLE_CLIENTS
    
    #!/bin/bash  
    
    logfile=/home/oracle/cron/session/log/killSession.log
    
    echo " " >> $logfile 2>&1
    
    echo "START ----`date`" >> $logfile 2>&1plus /nolog <<STATS
    
    connect / as sysdba
    
    exec sys.db_kill_idle_clients;
    
    exit;
    
    STATS
  • 相关阅读:
    Python爬虫框架Scrapy
    继承
    c/c++面试题(7)零碎知识总结
    Linux网络编程(多人在线聊天系统)
    第一章 计算机系统漫游
    Linux网络编程(简单的时间获取服务器)
    虚函数(1)
    c/c++面试题(9)linux方向
    Linux网络编程的一般步骤(1)
    进程/线程介绍
  • 原文地址:https://www.cnblogs.com/isme-zjh/p/14212140.html
Copyright © 2020-2023  润新知