#Dica - Matar sessões inativas no oracle database

Algumas vezes pode ser necessário que você elimine as sessões inativas a mais de um determinado tempo.
É importante sempre definir um tempo de expiração de acordo com a necessidade do seu ambiente. Neste caso estaremos utilizando o valor de 8 horas de inatividade.

O primeiro passo é identificar qual o profile associado ao usuário que vamos querer eliminar as sessões inativas. Para isso basta uma simples consulta na dba_users, conforme abaixo.
SQL> select profile from dba_users where username='LAMIM';

PROFILE
------------------------------
DEFAULT
No exemplo acima, o usuário LAMIM que é o que estaremos configurado para que as suas sessões inativas sejam eliminadas apos 8 horas, está definido como profile default. Vale lembrar que o processo afetara a todos os usuários que estiverem abaixo do profile default. Desta forma, se desejar pode ser criado um profile especifico para o usuário e definido um idle time para cada profile de acordo com a necessidade.

Vamos alterar o idle_time do profile default para 8 horas (480 minutos). Com o usuário sysdba, executar o comando abaixo.
 SQL> show parameter resource_limit; NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ resource_limit boolean FALSE SQL> alter system set resource_limit=true; System altered. SQL> show parameter resource_limit; NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ resource_limit boolean TRUE SQL> 

SQL> ALTER PROFILE default LIMIT IDLE_TIME  480;

Profile altered.

SQL>
Após definir o IDLE_TIME, vamos ativar o parâmetro resource_limit que por default estará em false e criar a procedure que irá eliminar as sessões inativas.
SQL> CREATE OR REPLACE PROCEDURE proc_kill_inactive_sessions IS
   CURSOR kill_sessions_cur
   IS
      SELECT s.SID, s.serial#
        FROM v$session s
       WHERE s.status = 'SNIPED';

   v_cmd   VARCHAR2 (100);
BEGIN
   FOR kill_sessions_rec IN kill_sessions_cur
  2    3    4    5    6    7    8    9   10   11     LOOP
      v_cmd :=
            'Alter system kill session '''
         || kill_sessions_rec.SID
         || ','
 12   13   14   15   16           || kill_sessions_rec.serial#
         || ''' immediate';

      EXECUTE IMMEDIATE v_cmd;
   END LOOP;
END;
/
 17   18   19   20   21   22
Procedure created.

SQL>
Após criar a procedure, estaremos criando um job para executa-la, com um intervalo de 1 hora.

SQL> DECLARE
  X NUMBER;
  2    3  BEGIN
  SYS.DBMS_JOB.SUBMIT
    ( job       => X
  4    5    6       ,what      => 'proc_kill_inactive_sessions();'
  7       ,next_date => sysdate
  8       ,interval  => 'SYSDATE + 60/1440'
     ,no_parse  => TRUE
    );
  9   10   11    SYS.DBMS_OUTPUT.PUT_LINE('Job Number is: ' || to_char(x));
END;
/
 12   13
PL/SQL procedure successfully completed.

SQL>
SQL>
commit;
SQL>
Commit complete.

SQL>
Nossa rotina de eliminação das sessões inativas esta pronta. A cada uma hora o job vai executar a procedure que eliminará as sessões que estão marcadas como SNIPED (de acordo com o IDLE_TIME definido no profile).

Comentários