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