批量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_sessionIS 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/shtmpfile0=/tmp/.kill_inactive_0tmpfile1=/tmp/.kill_inactive_1tmpfile2=/tmp/.kill_inactive_2sqlplus / as sysdba <<EOFspool $tmpfile1select '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 swhere s.paddr=p.addrand username='XIFENFEI'and s.status='INACTIVE';spool offEOFcat $tmpfile1>>$tmpfile0grep "^[0123456789]" $tmpfile1 |awk '{print $1}'>$tmpfile2for x in `cat $tmpfile2`dokill -9 $xdonerm $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
喜欢请赞赏一下啦^_^
微信赞赏
支付宝赞赏

浙公网安备 33010602011771号