Oracle
 sql >> Database >  >> RDS >> Oracle

Come uccidere un'istruzione SELECT in esecuzione

Mentre continui a ottenere pagine di risultati, presumo che tu abbia avviato la sessione in SQL * Plus. Se è così, la cosa più semplice da fare è premere ctrl + pausa molte, molte volte finché non si ferma.

I modi più complicati e più generici che descrivo di seguito in ordine di crescente ferocia / malvagità. Il primo probabilmente funzionerà per te, ma in caso contrario puoi continuare a spostarti verso il basso nell'elenco.

La maggior parte di questi non è consigliata e può avere conseguenze indesiderate.


1. Livello Oracle - Termina il processo nel database

Secondo la risposta di ObiWanKenobi e la documentazione di ALTER SESSION

alter system kill session 'sid,serial#';

Per trovare il sid , ID sessione e serial# , numero di serie, esegui la seguente query, riepilogata da OracleBase, e trova la tua sessione:

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 stai eseguendo un RAC, devi modificarlo leggermente per tenere conto delle istanze multiple, inst_id è ciò che li 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'

Questa query funzionerebbe anche se non stai eseguendo un RAC.

Se stai utilizzando uno strumento come PL/SQL Developer, anche la finestra delle sessioni ti aiuterà a trovarlo.

Per un "kill" leggermente più forte puoi specificare la parola chiave IMMEDIATE, che indica al database di non attendere il completamento della transazione:

alter system kill session 'sid,serial#' immediate;

2. Livello del sistema operativo - Emetti un SIGTERM

kill pid

Ciò presuppone che tu stia utilizzando Linux o un'altra variante *nix. Un SIGTERM è un segnale di terminazione dal sistema operativo al processo specifico chiedendogli di interrompere l'esecuzione. Cerca di far terminare il processo in modo regolare.

Un errore che potrebbe comportare l'interruzione dei processi essenziali del sistema operativo, quindi fai attenzione durante la digitazione.

Puoi trovare il pid , ID processo, eseguendo la query seguente, che ti fornirà anche informazioni utili come il terminale da cui è in esecuzione il processo e il nome utente che lo sta eseguendo in modo da assicurarti di scegliere quello corretto.

select p.*
  from v$process p
  left outer join v$session s
    on p.addr = s.paddr
 where s.sid = ?
   and s.serial# = ?

Ancora una volta, se stai eseguendo un RAC devi cambiarlo leggermente in:

select p.*
  from Gv$process p
  left outer join Gv$session s
    on p.addr = s.paddr
 where s.sid = ?
   and s.serial# = ?

Modifica del where clausola su where s.status = 'KILLED' ti aiuterà a trovare il processo già terminato che è ancora "in esecuzione".

3. Sistema operativo - Emetti un SIGKILL

kill -9 pid

Usando lo stesso pid hai raccolto in 2, un SIGKILL è un segnale dal sistema operativo a un processo specifico che provoca l'arresto immediato del processo. Ancora una volta fai attenzione durante la digitazione.

Raramente dovrebbe essere necessario. Se stavi eseguendo DML o DDL, interromperà l'elaborazione di qualsiasi rollback e potrebbe rendere difficile il ripristino del database in uno stato coerente in caso di errore.

Tutte le opzioni rimanenti uccideranno tutte le sessioni e comporteranno che il tuo database - e anche nel caso dei server 6 e 7 - non sarà più disponibile. Dovrebbero essere usati solo se assolutamente necessario...

4. Oracolo - Chiudere il database

shutdown immediate

Questo è in realtà più educato di un SIGKILL , sebbene ovviamente agisca su tutti i processi nel database piuttosto che sul tuo processo specifico. È sempre bene essere educati con il tuo database.

La chiusura del database dovrebbe essere eseguita solo con il consenso del tuo DBA, se ne hai uno. È bello dirlo anche alle persone che usano il database.

Chiude il database, termina tutte le sessioni ed esegue un rollback su tutte le transazioni non vincolate. Potrebbe volerci un po' di tempo se hai grandi transazioni non vincolate che devono essere annullate.

5. Oracolo - Spegni il database (il modo meno carino)

shutdown abort

Questo è più o meno lo stesso di un SIGKILL , anche se ancora una volta su tutti i processi nel database. È un segnale al database per fermare tutto immediatamente e morire:un duro crash. Termina tutte le sessioni e non esegue il rollback; per questo motivo può significare che il database impiega più tempo per startup ancora. Nonostante il linguaggio incendiario un shutdown abort non è un male puro e normalmente può essere usato in sicurezza.

Come prima, informa prima le persone le persone rilevanti.

6. Sistema operativo - Riavvia il server

reboot

Ovviamente, questo non solo interrompe il database ma anche il server, quindi utilizzalo con cautela e con il consenso dei tuoi amministratori di sistema oltre a DBA, sviluppatori, client e utenti.

7. Sistema operativo - L'ultima fase

Il riavvio non funziona... Una volta raggiunta questa fase, è meglio che tu speri che tu stia utilizzando una VM. Abbiamo finito per eliminarlo...