Qual é a maneira mais rápida de eliminar todas as sessões de um usuário especificado no Oracle?

4

Qual é a maneira mais rápida de eliminar todas as sessões de um usuário especificado no Oracle?

    
por Thomas Bratt 29.01.2010 / 18:57

5 respostas

9

Você deve conseguir fazer isso em um loop PL/SQL . Certifique-se de testá-lo apenas registrando os parâmetros antes de chamar kill session .

BEGIN
  FOR c IN (
    SELECT s.sid,
           s.serial#
    FROM   v$session s
    WHERE  s.username = 'your_user_name'
  )
  LOOP
    EXECUTE IMMEDIATE 'alter system kill session ''' || 
                      c.sid || ',' || c.serial# || '''';
  END LOOP;
END;

Veja uma pergunta sobre o asktom semelhante.

    
por 29.01.2010 / 19:03
2

Outra abordagem que pode ser executada mais rapidamente é gerar comandos orakill e executá-los em uma janela do DOS:

SELECT 'orakill '||d.name||' '||spid
  FROM v$session s JOIN v$process p ON addr=paddr
                   JOIN v$database d ON (1=1)
WHERE s.username = 'THE_USER';

Orakill não espera que as transações de sessão sejam concluídas, então o kill é muito rápido.

Qualquer que seja a sua solução, tenha cuidado!

    
por 29.01.2010 / 20:37
1

Uma coisa a ter em conta é que matar uma sessão no Oracle não impede necessariamente que a sessão do usuário (e processos associados) consumam recursos. Assim, uma consulta de fuga pode continuar a fugir, consumindo recursos como CPU e E / S e retendo bloqueios, até que ele volte a fazer o processo / thread do monitor de processo (pmon) do Oracle.

Assumindo o Oracle em execução em um sistema Unix no modo "conexão dedicada", é possível unir v $ session e v $ process em v $ session.paddr = v $ process.addr para localizar todas as sessões e processos para um dado conexões do usuário e use o comando kill do UNIX% com SIGKILL para eliminar os processos subjacentes do servidor para as sessões do usuário. O pmon irá então limpar a sessão com falha, revertendo todas as transações e liberando os bloqueios.

Esta é definitivamente uma abordagem de big-hammer quando a abordagem que Peter Lang apontou anteriormente não está matando as sessões do usuário agressivamente o suficiente.

    
por 29.01.2010 / 19:29
0

alter checkpoint do sistema;
desligamento abortar
inicialização restrita
shutdown immediate

:)

    
por 22.03.2010 / 16:29
0

Aqui está uma melhoria muito leve da resposta de Peter Lang que acho mais fácil de usar. É interativo e pede o nome de usuário:

PROMPT Entrer the username to kill;
DEFINE username = &1
BEGIN
  FOR c IN (
    SELECT s.sid,
           s.serial#
    FROM   v$session s
    WHERE  s.username = '&&username'
  )
  LOOP
    EXECUTE IMMEDIATE 'alter system kill session ''' || 
                      c.sid || ',' || c.serial# || '''';
  END LOOP;
END;
/
    
por 29.04.2010 / 15:45