Session'ların durumunu aşağıdaki gibi ayırabiliriz.
-O anda SQL çalıştırılıyorsa - ACTIVE
-Inactive session client tarafında bekletiliyorsa - SNIPED
-Herhangi bir SQL çalıştırmadan sisteme bağlı bekleniyorsa - INACTIVE
-Eğer session cache'e alındıysa - CACHED
Yukarıdaki tanımlara göre hangi session'ların ne kadar süre sonra "SNIPED" olarak ifade edilmesi gerektiğini bir parametreyi değiştirerek karar verebiliriz.
alter profile DEFAULT set idle_time=120;
Yukarıdaki parametre sayesinde 2 saat sonunda idle session'lar sniped olarak işaretlenir. Aşağıdaki SQL ile sniped session'ları bulup kill eden sorguları üretebiliriz.
SELECT DECODE(TRUNC(SYSDATE - LOGON_TIME), 0, NULL, TRUNC(SYSDATE - LOGON_TIME) || ' Days' || ' + ') || TO_CHAR(TO_DATE(TRUNC(MOD(SYSDATE-LOGON_TIME,1) * 86400), 'SSSSS'), 'HH24:MI:SS') LOGON, SID, v$session.SERIAL#, v$process.SPID UNIX_PROCESS, v$session.USERNAME, STATUS, OSUSER, MACHINE, v$session.PROGRAM, MODULE, 'alter system kill session ' || '''' || SID || ', ' || v$session.serial# || '''' || ' immediate;' kill_sql FROM v$session, v$process
WHERE ((v$session.paddr = v$process.addr) AND (status = 'SNIPED'))
ORDER BY logon_time ASC;
Buradaki prosedüre ile de yine istediğimizde bu takılı kalmış session'ları bulup bunları kill edebiliriz.
DECLARE
a v$session.SID%TYPE;
b v$session.serial#%TYPE;
cur INTEGER;
ret INTEGER;
STRING VARCHAR2 (100);
CURSOR mycursor
IS
SELECT SID, serial#
FROM v$session
WHERE status = 'SNIPED';
BEGIN
OPEN mycursor;
LOOP
FETCH mycursor
INTO a, b;
EXIT WHEN mycursor%NOTFOUND;
STRING :=
'alter system disconnect session '
|| ''''
|| TO_CHAR (a)
|| ','
|| TO_CHAR (b)
|| ''''
|| ' immediate';
BEGIN
cur := DBMS_SQL.open_cursor;
DBMS_SQL.parse (cur, STRING, DBMS_SQL.v7);
ret := DBMS_SQL.EXECUTE (cur);
DBMS_SQL.close_cursor (cur);
DBMS_OUTPUT.put_line ('SID:' || a || ' is killed.');
EXCEPTION
WHEN OTHERS
THEN
IF DBMS_SQL.is_open (cur)
THEN
DBMS_SQL.close_cursor (cur);
END IF;
END;
END LOOP;
CLOSE mycursor;
END;
/
Hiç yorum yok:
Yorum Gönder