News:
SQL Statements abbrechen - Neues Feature aus 18c schon in 12.2.0.1 nutzbar

Mit dem Oracle Datenbank 18c Befehl "alter system cancel sql" lassen sich bereits in 12.2 SQL Statements beenden.

Icon Unternehmen

Es gibt immer wieder Situationen, in denen man das gerade ausgeführte SQL Statement abbrechen möchte oder muss. Die Gründe dafür sind vielfältig - sei es nun, weil das Kommando fehlerhaft ist, es scheinbar ewig dauert oder mit den aktuellen Daten zu Problemen führt. Bisher war hierfür die einzige Methode die komplette zugehörige Session zu killen:

alter system kill session '<sid>,<serial#>'; 

Das Problem: Hierbei geht die komplette Sitzung mit allen eingestellten Parametern verloren. Deshalb soll lediglich das SQL Statement abgebrochen werden. Dies was bisher nicht möglich. Oracle verspricht für die Oracle Datenbankversion 18c Abhilfe. Der neue Befehl für den Abbruch eines SQL Statements lautet:

alter system cancel sql '<sid>,<serial#>[,@<inst_id>][,<sql_id>]';

Wer dies testen oder direkt einsetzen will, muss gar nicht auf die Veröffentlichung der Datenbank 18c für OnPremise Systeme warten. Oracle hat diese Funktion bereits in die Version 12.2.0.1 eingebaut, nur nicht offiziell dokumentiert. So ist es wohl auch eher als Betatest zu sehen. Aber schauen wir es uns einfach mal an:

SQL> select banner from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
PL/SQL Release 12.2.0.1.0 - Production
CORE    12.2.0.1.0      Production
TNS for Linux: Version 12.2.0.1.0 - Production
NLSRTL Version 12.2.0.1.0 – Production

Die Version 12.2 ist im Einsatz. Jetzt erzeugen wir ein lang laufendes Statement, am besten mit einer Endlosschleife:

SQL> begin 
       loop 
         null; 
       end loop; 
     end;
     /

Mit einer zweiten Sitzung schauen wir nach der Endlosschleife und lassen uns die Sessioninformation sowie SQL_ID ausgeben. 

set lines 170
col username for a30
set sql_text for a100

SELECT a.inst_id,sid,serial#,b.sql_id,username,sql_text
FROM gv$session a, v$sql b
WHERE a.sql_address = b.address
AND a.status = 'ACTIVE'
AND sql_text not like '%username%'
AND username IS NOT NULL;

INST_ID   SID  SERIAL#       SQL_ID  USERNAME   SQL_TEXT
------- ----- -------- ------------- --------- -------------------------------
     1     4   30120   g0r4qjf2cngv3    SYS      begin loop null; end loop; end;

Jetzt setzen wir den folgenden Befehl ab:

  alter system cancel sql '4,30120, g0r4qjf2cngv3';

Damit wird genau das betroffende SQL Statement abgebrochen. Es erscheint folgende Meldung:

begin
*
ERROR at line 1:
ORA-01013: user requested cancel of current operation

Es ist weiterhin möglich, alle SQL Statements der Session zu beenden, indem nur zwei Parameter gesetzt und dabei die <sql_id> weggelassen wird.Hier wird das aktuell laufende Statement der Session abgebrochen. Dies muss aber nicht unbedingt das SQL Statement sein, welches wir abbrechen wollten.
Um ganz sicherzugehen, gibt man die SQL ID mit an.

Bei einem Clustersystem sollte zusätzlich die Instanz ID (@<inst_id>) gesetzt werden.

Fazit
Wenn Ihnen wieder einmal ein SQL Statement aus dem Ruder läuft, brechen Sie erst das betroffene SQL Kommando ab, bevor die komplette Session beendet wird. Ab Oracle Database 12.2.0.1 steht ihnen das Feature sowohl in der EE als auch in der SE2 Edition zur Verfügung.