Hurriyet

22 Kasım 2013 Cuma

Oracle E-Business Suite: Idle Kullanıcıların Kesilmesi - Killing Idle Sniped Users, Connections

Bazı kullanıcılar application'a bağlanıp işlerini bitirdikten sonra browser'larını ya da bulundukları session'ı kapamayıp, öylece bırakırlar. Bunlar sistemden kaynak kullandıkları için bunların bulunması ve eğer iş çalıştırmıyorlarsa kill edilmesi gerekir.

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