Entrar

OracleBR

Artigo

Inicial - Artigos

Eliminando sessões Inativas no bd Oracle

Autor: José Laurindo Chiappa (jlchiappa@yahoo.com.br)

 

Muitas vezes é necessário a eliminação "forçada" de sessões inativas num bd Oracle (normalmente porque o operador encerrou o seu trabalho mas não desconectou, deixando erradamente a tale do aplicativo aberta, ainda conectada.

Pensando em conexão dedicada e banco 9i ou superior, que são o caso mais comum, essa eliminação seria feita num job que periodicamente, seja via comandos ALTER SYSTEM DISCONNECT 'sid, serial' IMMEDIATE; , ou até mais diretamente eliminando-se o processo shadow dessa conexão diretamente no servidor.

Há porém um ponto a considerar, qual seja : no bd Oracle quando vc elimina uma sessão ela NÃO é removida até que expire OU que o usuário tente fazer um novo acesso ao banco, quando aí sim receberá uma mensagem "vc foi desconectado" e só então efetivamente será desconectado e a respectiva sessão eliminada - se quisermos que a sessão seja removida antes mesmo que o usuário tente fazer novo acesso ao banco, poderíamos utilizar um PROFILE, cfrme :

system@BDDEV:SQL>show parameters resource_limit

NAME TYPE VALUE
------------------------------------ -----------
------------------------------
resource_limit boolean TRUE

system@BDDEV:SQL>create profile prof_idle_2_minutos limit idle_time 120;

Perfil criado.


system@BDDEV:SQL>alter user scott profile prof_idle_2_minutos;

Usuário alterado.

==> aí conecto no usuário SCOTT. Veja que enquanto a sessão não está fazendo
NADA mas está conectada o idle_time não atua :

scott@BDDEV:SQL>select sysdate from dual;

SYSDATE
-------------------
04/07/2006 09:47:41

... não estou fazendo nada , espero uns minutos e volto à sessão, tento fazer
outro acesso ao banco, vai ok :

scott@BDDEV:SQL>/

SYSDATE
-------------------
04/07/2006 09:50:18

==> agora vem o teste: vou fazer uma QUERY "grande" e demorada (*** NÃO *** é
DML, pois no caso de DMLs há que se remover locks, fazer rollback, isso é MESMO
demorado) :

scott@BDDEV:SQL>select * from all_tab_columns;
... executando ...

==> aí consulto a situação na v$session, está lá, está ativa, normal :

..... SID SERIAL# ... STATUS SERVER ...
---- ------- -------- ---------
20 34889 ACTIVE DEDICATED

system@BDDEV:SQL>alter system disconnect session '20, 34889' immediate;

==> imediatamente a sessão foi marcada como KILLED

system@BDDEV:SQL>select * from v$session where username='SCOTT';

..... SID SERIAL# ... STATUS SERVER ...
..... ---- ------- ... -------- ---------
..... 20 34889 ... KILLED PSEUDO

==> espero um pouco pra dar o tempo de inatividade...

system@BDDEV:SQL>/

não há linhas selecionadas

==> e senm ter feito nada, na sessão que "morreu" eu obtenho :

SYS EXU8NXPU NAME
SYS EXU9TABU DOBJID
ERROR:
ORA-00028: your session has been killed

e realmente a sessão foi eliminada, se tentar um acesso ao banco :

scott@BDDEV:SQL>select 1 from dual;
select 1 from dual
*
ERRO na linha 1:
ORA-01012: not logged on


Abraços,

Chiappa



Data de Inclusão: 30/08/2006 | Última Alteração: 30/08/2006