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.
É 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
Postar um comentário