quinta-feira, 4 de dezembro de 2008

Eliminar sessão

Matar uma sessão do usuário é um dos maiores prazeres que um DBA pode ter, ainda mais sem a ciência daquele usuário mala :) . Brincadeiras a parte, as vezes temos que eliminar algumas sessões, o que deveria ser algo fácil.

Por exemplo, para matar a sessao do "zemane" que está consumindo recursos pois foi executada erroneamente, deve-se executar o comando:

SQL> ALTER SYSTEM KILL SESSION 'SID, SERIAL#';
Onde SID e SERIAL# são obtidos pelo select abaixo. Acontece que em alguns casos, a sessão morta, continuá lá atrapalhando o banco com o status de KILLED.

SQL> SELECT S.USERNAME, S.MACHINE, S.OSUSER, S.STATUS,
S.LAST_CALL_ET LAST, S.SID, S.SERIAL#, P.SPID
FROM V$SESSION S, V$PROCESS P
WHERE S.PADDR = P.ADDR
ORDER BY S.USERNAME, S.MACHINE, S.OSUSER

USERNAME MACHINE OSUSER STATUS LAST SID SERIAL# SPID
--------- -------- --------- -------- ------ ----- ------- ----
LOC_DEV DEV314 jninguem INACTIVE 10494 51 3589 618
LOC_DEV DEV317 zemane ACTIVE 18126 82 21437 222
LOC_HOM SRV004 brockbus INACTIVE 10917 120 19171 123
...

47 rows selected

SQL>alter system kill session '82, 21437' ;

alter system kill succeeded.

SQL> SELECT S.USERNAME, S.MACHINE, S.OSUSER, S.STATUS, ...

USERNAME MACHINE OSUSER STATUS LAST SID SERIAL# SPID
--------- -------- --------- -------- ------ ----- ------- ----
LOC_DEV DEV314 jninguem INACTIVE 10494 51 3589 618
LOC_DEV DEV317 zemane KILLED 18126 82 21437 222
LOC_HOM SRV004 brockbus INACTIVE 10917 120 19171 123
...

47 rows selected

Nesses casos, temos que matar o processo no sistema operacional.

No linux:
$ kill -9 2222
Onde 222 é o SPID obtido no select acima.

Agora no windows, acontecem 2 coisas interessantes.
1. O Windows não abre um processo para cada cliente. Os clientes são threads do processo principal (Oracle).
2. Não existe o comando kill no Windows.
Por isso a Oracle disponibilizou o comando ORAKILL <ORACLE_SID> <serial#>
> orakill ORCL 21437
Assim o processo é eliminado do banco de dados.
PS. Matar um processo via sistema operacional não deixa log no banco de dados.

Nenhum comentário: