1. Start
  2. Unternehmen
  3. Blog
  4. SQL-Langläufer abbrechen

Gerade während der Entwicklung von Datenbankanwendungen kommt es immer wieder vor, dass eine Session hängt, weil die Ausführung eines SQL-Statements unverhältnismässig lange dauert. Sei es, weil eine WHERE-Bedingung falsch ist oder vergessen wurde oder weil die zu verarbeitende Datenmenge größer als gedacht war. Bisher war die einzige Möglichkeit das SQL abzubrechen, die Session zu beenden. Dazu wurde die SID und die Serial-Number benötigt.

 

SQL> select sid, serial#, sql_id, last_call_et from v$session where username is not null and status='ACTIVE';

       SID    SERIAL# SQL_ID        LAST_CALL_ET
---------- ---------- ------------- ------------
        59      38588 dn71p3czhz4p0           32
       281      36759 c4a42qyrtqvnk            0

SQL> alter system kill session '59,38588';

System altered.

 

Hier war die fragliche Session also seit mehr als 30 Sekunden mit der Ausführung beschäftigt und wurde daher abgebrochen. Die ausführende Session kann ab diesem Zeitpunkt nicht mehr weiterarbeiten, sondern es muss eine neue Verbindung zur Datenbank aufgebaut werden.

 

SQL> select count(*) from dba_source, dba_source, dba_source;
select count(*) from dba_source, dba_source, dba_source
                     *
ERROR at line 1:
ORA-00028: your session has been killed

 

Seit Oracle Version 18 gibt es einen eleganteren und weniger invasiven Weg, die Ausführung zu beenden. In den New Features der SQL Language Reference wird das Feature als "Manual termination of Run-Away Queries" vorgestellt. In der Beschreibung zu ALTER SYSTEM findet sich dann der "cancel_sql_clause", der diese Aufgabe übernimmt. Auch hier wird die SID und Serial Number benötigt, jedoch kann zusätzlich noch eine SQL-ID mitgegeben werden, die das zu beendende SQL-Statement identifiziert. Die Verwendung ist demnach rech trivial. Wird die SQL-ID weggelassen, so wird das gerade ausgeführte Statement beendet.

 

SQL> select sid, serial#, sql_id, last_call_et from v$session where username is not null and status='ACTIVE';

       SID    SERIAL# SQL_ID        LAST_CALL_ET
---------- ---------- ------------- ------------
       264      26596 dn71p3czhz4p0           31
       281      36759 c4a42qyrtqvnk            0

SQL> alter system cancel sql '264,26596';

System altered.

 

Wird die SQL-ID hingegen mitgegeben, so wird nur dieses Statement beendet. Ist das mittlerweile zum Ende gekommen, wird nichts unternommen.

 

SQL> alter system cancel sql '264,26596,dn71p3czhz4p0';
alter system cancel sql '264,26596,dn71p3czhz4p0'
*
ERROR at line 1:
ORA-00866: invalid or non-existent SQL ID

 

Die ausführende Session kann danach einfach weiterarbeiten. Das Verhalten ist, als ob die Ausführung per STRG+C selbst abgebrochen wurde.

 

SQL> select count(*) from dba_source, dba_source, dba_source;
select count(*) from dba_source, dba_source, dba_source
                     *
ERROR at line 1:
ORA-01013: user requested cancel of current operation


SQL> select * from dual;

D
-
X

 

 Alles in allem eine kleine, aber sehr praktische Erweiterung.

Kommentare

Keine Kommentare

Kommentar schreiben

* Diese Felder sind erforderlich