Oracle
 sql >> Datenbank >  >> RDS >> Oracle

So beenden Sie eine laufende SELECT-Anweisung

Da Sie immer wieder Seiten mit Ergebnissen erhalten, gehe ich davon aus, dass Sie die Sitzung in SQL*Plus gestartet haben. Wenn ja, ist es einfach, ctrl zu bashen + unterbrechen viele, viele Male, bis es aufhört.

Die komplizierteren und allgemeineren Wege beschreibe ich unten in der Reihenfolge zunehmender Wildheit / Bösartigkeit. Der erste wird wahrscheinlich für Sie funktionieren, aber wenn nicht, können Sie die Liste weiter nach unten verschieben.

Die meisten davon werden nicht empfohlen und können unbeabsichtigte Folgen haben.


1. Oracle-Ebene - Beenden Sie den Prozess in der Datenbank

Gemäß der Antwort von ObiWanKenobi und der ALTER SESSION-Dokumentation

alter system kill session 'sid,serial#';

Um die sid zu finden , Sitzungs-ID und die serial# , Seriennummer, führen Sie die folgende Abfrage aus - zusammengefasst von OracleBase - und finden Sie Ihre Sitzung:

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'

Wenn Sie einen RAC ausführen, müssen Sie dies leicht ändern, um die mehreren Instanzen zu berücksichtigen, inst_id ist, was sie identifiziert:

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'

Diese Abfrage funktioniert auch, wenn Sie keinen RAC ausführen.

Wenn Sie ein Tool wie PL/SQL Developer verwenden, hilft Ihnen auch das Sitzungsfenster, es zu finden.

Für ein etwas stärkeres "Kill" können Sie das Schlüsselwort IMMEDIATE angeben, das die Datenbank anweist, nicht auf den Abschluss der Transaktion zu warten:

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

2. Betriebssystemebene - Geben Sie ein SIGTERM aus

kill pid

Dies setzt voraus, dass Sie Linux oder eine andere *nix-Variante verwenden. Ein SIGTERM ist ein Beendigungssignal vom Betriebssystem an den spezifischen Prozess, der ihn auffordert, die Ausführung zu beenden. Es versucht, den Prozess ordnungsgemäß beenden zu lassen.

Eine falsche Eingabe kann dazu führen, dass Sie wichtige Betriebssystemprozesse beenden. Seien Sie also vorsichtig bei der Eingabe.

Sie finden die pid , Prozess-ID, indem Sie die folgende Abfrage ausführen, die Ihnen auch nützliche Informationen wie das Terminal, von dem der Prozess ausgeführt wird, und den Benutzernamen, der ihn ausführt, mitteilt, damit Sie sicherstellen können, dass Sie den richtigen auswählen.

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

Wenn Sie einen RAC ausführen, müssen Sie dies noch einmal leicht ändern in:

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

Ändern des where -Klausel zu where s.status = 'KILLED' wird Ihnen helfen, bereits beendete Prozesse zu finden, die noch "laufen".

3. Betriebssystem - Geben Sie ein SIGKILL aus

kill -9 pid

Unter Verwendung der gleichen pid du hast in 2 einen SIGKILL aufgeschnappt ist ein Signal vom Betriebssystem an einen bestimmten Prozess, das bewirkt, dass der Prozess sofort beendet wird. Seien Sie noch einmal vorsichtig beim Tippen.

Dies sollte selten erforderlich sein. Wenn Sie DML oder DDL verwendet haben, wird die Verarbeitung von Rollbacks gestoppt und kann erschweren die Wiederherstellung der Datenbank in einen konsistenten Zustand im Falle eines Ausfalls.

Alle verbleibenden Optionen beenden alle Sitzungen und führen dazu, dass Ihre Datenbank - und im Fall von 6- und 7-Servern auch - nicht mehr verfügbar ist. Sie sollten nur verwendet werden, wenn es absolut notwendig ist...

4. Oracle - Herunterfahren der Datenbank

shutdown immediate

Das ist tatsächlich höflicher als ein SIGKILL , obwohl es offensichtlich eher auf alle Prozesse in der Datenbank als auf Ihren spezifischen Prozess wirkt. Es ist immer gut, höflich zu Ihrer Datenbank zu sein.

Das Herunterfahren der Datenbank sollte nur mit Zustimmung Ihres DBA erfolgen, falls Sie einen haben. Es ist schön, es auch den Leuten zu sagen, die die Datenbank benutzen.

Es schließt die Datenbank, beendet alle Sitzungen und führt ein rollback durch auf alle nicht festgeschriebenen Transaktionen. Es kann eine Weile dauern, wenn Sie große, nicht festgeschriebene Transaktionen haben, die zurückgesetzt werden müssen.

5. Oracle - Herunterfahren der Datenbank (der weniger nette Weg)

shutdown abort

Dies entspricht ungefähr einem SIGKILL , allerdings noch einmal auf alle Prozesse in der Datenbank. Es ist ein Signal an die Datenbank, alles sofort zu stoppen und zu sterben - ein harter Absturz. Es beendet alle Sitzungen und führt kein Rollback durch; Aus diesem Grund kann es dazu führen, dass die Datenbank länger zum startup braucht wieder. Trotz der aufrührerischen Sprache ein shutdown abort ist nichts Böses und kann normalerweise sicher verwendet werden.

Wie bisher zuerst die zuständigen Personen informieren.

6. Betriebssystem - Starten Sie den Server neu

reboot

Offensichtlich stoppt dies nicht nur die Datenbank, sondern auch den Server, also verwenden Sie es mit Vorsicht und mit Zustimmung Ihrer Systemadministratoren zusätzlich zu den DBAs, Entwicklern, Kunden und Benutzern.

7. Betriebssystem - Die letzte Stufe

Ich hatte einen Neustart, der nicht funktioniert hat ... Wenn Sie dieses Stadium erreicht haben, hoffen Sie besser, dass Sie eine VM verwenden. Am Ende haben wir es gelöscht...