Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como matar uma instrução SELECT em execução


Como você continua recebendo páginas de resultados, suponho que você iniciou a sessão no SQL*Plus. Se sim, a coisa mais fácil a fazer é bash ctrl + quebrar muitas, muitas vezes até parar.

A(s) maneira(s) mais complicada(s) e mais genérica(s) eu detalho abaixo em ordem crescente de ferocidade/maldade. O primeiro provavelmente funcionará para você, mas se não funcionar, você pode continuar descendo a lista.

A maioria delas não é recomendada e pode ter consequências não intencionais.



1. Nível Oracle - Mate o processo no banco de dados


De acordo com a resposta de ObiWanKenobi e a documentação ALTER SESSION
alter system kill session 'sid,serial#';

Para encontrar o sid , ID da sessão e o serial# , número de série, execute a seguinte consulta - resumida do OracleBase - e encontre sua sessão:
select s.sid, s.serial#, p.spid, s.username, s.schemaname
     , s.program, s.terminal, s.osuser
  from v$session s
  join v$process p
    on s.paddr = p.addr
 where s.type != 'BACKGROUND'

Se você estiver executando um RAC, precisará alterar um pouco isso para levar em consideração as várias instâncias, inst_id é o que os identifica:
select s.inst_id, s.sid, s.serial#, p.spid, s.username
     , s.schemaname, s.program, s.terminal, s.osuser
  from Gv$session s
  join Gv$process p
    on s.paddr = p.addr
   and s.inst_id = p.inst_id
 where s.type != 'BACKGROUND'

Essa consulta também funcionaria se você não estiver executando um RAC.

Se você estiver usando uma ferramenta como o PL/SQL Developer, a janela de sessões também o ajudará a encontrá-la.

Para um "kill" um pouco mais forte, você pode especificar a palavra-chave IMMEDIATE, que instrui o banco de dados a não esperar a conclusão da transação:
alter system kill session 'sid,serial#' immediate;

2. Nível do SO - Emitir um SIGTERM

kill pid

Isso pressupõe que você esteja usando Linux ou outra variante *nix. Um SIGTERM é um sinal de término do sistema operacional para o processo específico solicitando que ele pare de executar. Ele tenta deixar o processo terminar normalmente.

Fazer isso errado pode resultar no encerramento de processos essenciais do SO, portanto, tenha cuidado ao digitar.

Você pode encontrar o pid , process id, executando a consulta a seguir, que também fornecerá informações úteis, como o terminal do qual o processo está sendo executado e o nome de usuário que o está executando, para que você possa garantir a escolha correta.
select p.*
  from v$process p
  left outer join v$session s
    on p.addr = s.paddr
 where s.sid = ?
   and s.serial# = ?

Mais uma vez, se você estiver executando um RAC, precisará alterar um pouco para:
select p.*
  from Gv$process p
  left outer join Gv$session s
    on p.addr = s.paddr
 where s.sid = ?
   and s.serial# = ?

Alterando o where cláusula para where s.status = 'KILLED' irá ajudá-lo a encontrar processos já mortos que ainda estão "em execução".

3. SO - Emitir um SIGKILL

kill -9 pid

Usando o mesmo pid você pegou em 2, um SIGKILL é um sinal do sistema operacional para um processo específico que faz com que o processo termine imediatamente. Mais uma vez, tenha cuidado ao digitar.

Isso raramente deve ser necessário. Se você estiver fazendo DML ou DDL, isso interromperá o processamento de qualquer reversão e pode dificultar a recuperação do banco de dados para um estado consistente em caso de falha.

Todas as opções restantes matarão todas as sessões e resultarão em seu banco de dados - e no caso do servidor 6 e 7 também - ficar indisponível. Eles só devem ser usados ​​se for absolutamente necessário...

4. Oráculo - Desligue o banco de dados

shutdown immediate

Na verdade, isso é mais educado do que um SIGKILL , embora obviamente ele atue em todos os processos no banco de dados e não em seu processo específico. É sempre bom ser educado com seu banco de dados.

O encerramento do banco de dados só deve ser feito com o consentimento do seu DBA, se você tiver um. É bom contar também para as pessoas que usam o banco de dados.

Ele fecha o banco de dados, encerrando todas as sessões e faz um rollback em todas as transações não confirmadas. Pode demorar um pouco se você tiver grandes transações não confirmadas que precisam ser revertidas.

5. Oráculo - Desligue o banco de dados (a maneira menos agradável)

shutdown abort

Isso é aproximadamente o mesmo que um SIGKILL , embora mais uma vez em todos os processos no banco de dados. É um sinal para o banco de dados parar tudo imediatamente e morrer - um acidente grave. Ele encerra todas as sessões e não reverte; por isso pode significar que o banco de dados demora mais para startup novamente. Apesar da linguagem incendiária, um shutdown abort não é puro mal e normalmente pode ser usado com segurança.

Como antes, informe primeiro as pessoas relevantes.

6. SO - Reinicie o servidor

reboot

Obviamente, isso não apenas interrompe o banco de dados, mas também o servidor, portanto, use com cautela e com o consentimento de seus administradores de sistema, além dos DBAs, desenvolvedores, clientes e usuários.

7. SO - A última etapa


A reinicialização não funcionou... Uma vez que você tenha alcançado este estágio, é melhor esperar que esteja usando uma VM. Acabamos deletando...