Neste post falaremos sobre diversas maneiras de eliminar sessões num Servidor Oracle. O processo de matar sessões em um banco de dados Oracle deve ser feito com muito cuidado, pois se você eliminar uma sessão de um processo de servidor, o instância poderá
sofrer um processo de shut down.
Para isso devemos identificar primeiramente qual e a sessão que devera ser eliminada.
Para identificar de forma mais precisa qual a sessão que deverá ser eliminada, você deve pesquisar nas visões [G]V$SESSION e [G]V$PROCESS, o prefixo [G] refere as visões do banco de dados em ambientes com Oracle RAC.
Segue abaixo um exemplo de script para identificar as sessões no banco de dados:
SELECT s.inst_id,
s.sid,
s.serial#,
p.spid,
s.username,
s.program
FROM gv$session s
JOIN gv$process p
ON p.addr = s.paddr
AND p.inst_id = s.inst_id
WHERE s.type != ‘BACKGROUND’;
O select acima esta identifica as sessões em ambiente RAC para ambiente single instance segue o select abaixo:
SELECT s.sid,
s.serial#,
p.spid,
s.username,
s.program
FROM v$session s
JOIN v$process p
ON p.addr = s.paddr
WHERE s.type != ‘BACKGROUND’;
Com os valores de SID, SERIAL#, SPID da sessão desejada utilizaremos os métodos abaixo para matar a sessão.
1 – Podemos usar o comando ALTER SYSTEM KILL SESSION
A sintaxe básica para matar uma sessão é esta abaixo:
ALTER SYSTEM KILL SESSION ‘SID,SERIAL#’;
Em um ambiente com Oracle RAC, além dos valores SID e SERIAL#,
pode-se informar o valor de INST_ID (instrução opcional), que indica qual a instância que se encontra a sessão.
Essa opção permite que se remova uma sessão de um Oracle RAC mesmo estando conectado num nó diferente.
ALTER SYSTEM KILL SESSION ‘SID,SERIAL#,@INST_ID’;
O comando acima não mata a sessão imediatamente, ele pede apenas para ela se matar. Nesses casos a sessão tera o status ˜marked for kill˜es.tes casos, a sessão terá um status de “marked for kill”. Se a sessão tiver uma transação ativa, um rollback deverá ocorrer e somente depois desta operação é que o usuário receberá a mensagem. Se a sessão estiver ociosa, o usuário só receberá a mensagem de erro quando tentar usar novamente o sistema vinculado àquela sessão.
O comando ALTER SYSTEM KILL SESSION possui a cláusula IMMEDIATE, que pode ser utilizada para retornar o controle da sessão imediatamente. Sem esta cláusula, ao executá-lo, você terá que aguardar o rollback de alguma transação existente.
Segue abaixo o exemplo da sintaxe ALTER … KILL SESSION IMMEDIATE:
ALTER SYSTEM KILL SESSION ‘SID,SERIAL#’ IMMEDIATE; – para ambiente single instance
ALTER SYSTEM KILL SESSION ‘SID,SERIAL#,@INST_ID’ IMMEDIATE; para ambiente RAC
2 – Usando o comando comando ALTER SYSTEM KILL DISCONNECT SESSION
A sintaxe ALTER SYSTEM DISCONNECT SESSION é um método alternativo para matar sessões Oracle.
Ao contrário do comando KILL SESSION que pede a sessão para matar-se, o comando DISCONNECT SESSION mata o processo servidor dedicado, que é equivalente a matar o processo do servidor do sistema operacional. A sintaxe básica é semelhante ao comando KILL SESSION com a adição da cláusula POST_TRANSACTION (aguarda transações em execução terminarem, sem forçar rollback) ou IMMEDIATE (finaliza e faz rollback nas transações em execução, imediatamente).
ALTER SYSTEM KILL DISCONNECT SESSION ‘SID,SERIAL#’ IMMEDIATE;
ALTER SYSTEM KILL DISCONNECT SESSION ‘SID,SERIAL#’ POST_TRANSACTION;
para ambiente RAC executamos o seguinte commando:
ALTER SYSTEM KILL DISCONNECT SESSION ‘SID,SERIAL#,@INST_ID’ IMMEDIATE;
Este comando significa que você nunca deve precisar usar comandos para o sistema operacional para matar sessões, o que reduz as chances de matar o processo errado.
Além disso, caso as clausulas POST_TRANSACTION or IMMEDIATE seja omitidas na sintaxe do comando, você receberá uma mensagem de erro:
SQL> alter system disconnect session ‘30,7’;
alter system disconnect session ‘30,7’
*
ERROR at line 1:
ORA-02000: missing POST_TRANSACTION or IMMEDIATE keyword
SQL>
3 – Eliminando Sessões através do Sistema Operacional
Em Ambiente WINDOWS
Para matar a sessão no sistema operacional Windows, primeiro devemos identificar a sessão e em seguida, substituir os valores relevantes SID e SPID para o seguinte comando emitido a partir da linha de comando:
C:> orakill ORACLESID spid
Após a execução do comando acima, o processo e morto imediatamente e todos os recursos são liberados.
Em Ambiente Linux / UNIX
Para matar a sessão em sistemas operacionais UNIX ou Linux, primeiro identificar a sessão, em seguida, substituir o relevante SPID para o comando a seguir.
kill spid
Se depois de alguns minutos, o processo não parou, encerrar a sessão usando o seguinte.
kill -9 spid
Espero ter ajudado. Ate o próximo post.