zoukankan      html  css  js  c++  java
  • 批量kill session实现脚本

    在很多使用,因为各种原因,我们需要定时批量的kill一部分session,用来释放数据库部分资源,这里是因为bug导致temp不能正常释放,也可能是因为bug导致pga不释放,还有可能是因为太多inactive占用资源等等.我这里提供了两种方法来实现该功能
    存储过程实现kill session

    --创建记录表
    CREATE TABLE kill_session_record
    (
       kill_time        DATE,
       kill_statement   VARCHAR2 (1000)
    )
    /
     
    --创建kill session存储过程
    CREATE OR REPLACE PROCEDURE kill_inactive_session
    IS
       CURSOR c
       IS
          SELECT sid, serial#
            FROM v$session s
           WHERE s.status = 'INACTIVE' AND s.username = 'XIFENFEI';
     
       k_sid      NUMBER;
       k_serial   NUMBER;
    BEGIN
       OPEN c;
     
       FETCH c
       INTO k_sid, k_serial;
     
       WHILE c%FOUND
       LOOP
          BEGIN
             EXECUTE IMMEDIATE
                   'ALTER SYSTEM DISCONNECT SESSION '''
                || k_sid
                || ','
                || k_serial
                || ''' IMMEDIATE';
     
             INSERT INTO kill_session_record (kill_time, kill_statement)
                  VALUES (
                            SYSDATE,
                               'ALTER SYSTEM DISCONNECT SESSION '''
                            || k_sid
                            || ','
                            || k_serial
                            || ''' IMMEDIATE');
          EXCEPTION
             WHEN OTHERS
             THEN
                INSERT INTO kill_session_record (kill_time, kill_statement)
                     VALUES (
                               SYSDATE,
                                  'Failure:ALTER SYSTEM DISCONNECT SESSION '''
                               || k_sid
                               || ','
                               || k_serial
                               || ''' IMMEDIATE');
     
                COMMIT;
          END;
     
          FETCH c
          INTO k_sid, k_serial;
       END LOOP;
     
       COMMIT;
     
       CLOSE c;
    END;
    /
     
    --设置job定时运行
    DECLARE
       job   NUMBER;
    BEGIN
       sys.DBMS_JOB.submit (job,
                            what        => 'kill_inactive_session;',
                            next_date   => SYSDATE,
                            interval    => 'TRUNC(SYSDATE + 1) +7/24');
       COMMIT;
       DBMS_OUTPUT.put_line (job);
    END;
    /

    如果是10GR2之前版本,需要把ALTER SYSTEM DISCONNECT SESSION 换成ALTER SYSTEM KILL SESSION

    shell kill session

    --shell脚本
    # more kill_inactive_session.sh
    #!/bin/sh
    tmpfile0=/tmp/.kill_inactive_0
    tmpfile1=/tmp/.kill_inactive_1
    tmpfile2=/tmp/.kill_inactive_2
    sqlplus / as sysdba <<EOF
    spool $tmpfile1
    select 'kill time:'||to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') execute_time from dual;
    select p.spid,s.sid,s.serial# from v$process p,v$session s
    where s.paddr=p.addr
    and username='XIFENFEI'
    and s.status='INACTIVE';
    spool off
    EOF
    cat $tmpfile1>>$tmpfile0
    grep "^[0123456789]" $tmpfile1 |awk '{print $1}'>$tmpfile2
    for x in `cat $tmpfile2`
    do
    kill -9 $x
    done
    rm $tmpfile1 $tmpfile2
     
    --contab 调度
    00 07 * * * /u01/script/kill_inactive_session.sh

    两个脚本都可以在where中加一些限制条件,来实现你需要kill的会话.数据库级别kill相对系统级别来说更加温和点,建议优先考虑数据库级别kill session.如果要求立即释放资源,可能需要考虑系统级别.两中kill方式对于未提交且是inactive session都会被kill掉,然后回滚事务.

    引用:

    https://www.xifenfei.com/2013/05/%E6%89%B9%E9%87%8Fkill-session%E5%AE%9E%E7%8E%B0%E8%84%9A%E6%9C%AC.html

    喜欢请赞赏一下啦^_^

    微信赞赏

    支付宝赞赏

  • 相关阅读:
    圣诞放长假了
    设计模式Top10排行榜
    成长的烦恼
    小三的故事发家篇
    《家庭财务总管》升级(1.0.0.2)
    紧急项目处理方法
    隐身大法,使民无知
    如何维护自己文章的版权
    在深度学习的视觉VISION领域数据预处理的魔法常数magic constant、黄金数值: mean=[0.485, 0.456, 0.406],std=[0.229, 0.224, 0.225]
    ImageNet数据集下载
  • 原文地址:https://www.cnblogs.com/lkj371/p/15235765.html
Copyright © 2011-2022 走看看