Oracle
Sessions
Vorhandene Artikel:

Es gibt Fälle, da ist der Datenbankadministrator gezwungen eine Session
beenden. Z.B. wenn diese andere blockiert oder versehentlich eine
Endlosschleife programmiert wurde.
Mit folgendem Statement findet man die hierzu notwendigen Informationen:
COLUMN spid FORMAT A10
COLUMN username FORMAT A10
COLUMN program FORMAT A45T A45
SELECT s.inst_id,
s.sid,
s.serial#,
p.spid,
s.username,
s.status,
s.program
FROM gv$session s
INNER JOIN gv$process p ON (p.addr = s.paddr AND p.inst_id = s.inst_id)
WHERE s.type = 'USER';
INST_ID SID SERIAL# SPID USERNAME STATUS PROGRAM
---------- ---------- ---------- ---------- ---------- --------
---------------------------------------------
1 1084 1277 6579 SYS ACTIVE sqlplus@oracle1.exirius.local
1 1083 595 6674 PUSTEKUCHE ACTIVE sqlplus@oracle1.exirius.local
1 1077 1277 6705 ACTIVE oracle@oracle1.exirius.local
1 1081 56 20830 ACTIVE oracle@oracle1.exirius.local
1 1072 1 20832 ACTIVE oracle@oracle1.exirius.local
1 1071 1 20834 ACTIVE oracle@oracle1.exirius.local
*ALTER SYSTEM KILL SESSION*
Mit
alter system kill session 'sid,serial#';
bzw bei einem RAC:
alter system kill session 'sid,serial#@inst_id';
wird die Session aufgefordert sich zu beenden. Die Session rollt die
offene Transaction zurück und beendet sich dann. Das bedeutet, wenn die
Session vor dem Kill Befehl 15 Minuten DML-Befehle abgesetzt hat, dann
wird sie auch ca. 15 Minuten diese zurückrollen.
Mit der Option
alter system kill session 'sid,serial#' immediate;
bekommt man direkte Kontrolle der eigenen Session zurück und muss nicht
warten, bis die Session beendet ist.
Wird ein Rollback ausgeführt, so wechselt der Status der Session in der
Abfrage oben auf killed.
Den Fortschritt des Zurückrollen kann man mit folgendem Befehl beobachten:
SET LINES 300
COLUMN username FORMAT A15
SELECT s.username,
s.sid,
s.serial#,
t.used_ublk,
t.used_urec,
rs.segment_name,
r.rssize,
r.status
FROM gv$transaction t
INNER JOIN gv$session s on (s.saddr=t.ses_addr and s.inst_id=t.inst_id)
INNER JOIN gv$rollstat r on (t.xidusn=r.usn and t.inst_id=r.inst_id)
INNER JOIN dba_rollback_segs rs on (rs.segment_id=t.xidusn)
ORDER BY t.used_ublk DESC
;
USERNAME SID SERIAL# USED_UBLK USED_UREC SEGMENT_NAME
RSSIZE STATUS
--------------- ---------- ---------- ---------- ----------
------------------------------ ---------- ---------------
PUSTEKUCHEN 1083 595 8622 1000000 _SYSSMU18$ 75620352 ONLINE
Hier wird der Eintrag der Spalte USED_UREC kleiner.
Man sollte hier Geduld haben und den Rollback abwarten.
Blockiert die Session allerdings andere wichtige Sessions, kann man die
Session auch auf Betriebssystemebene beenden.
*ALTER SYSTEM DISCONNECT** SESSION*
Ab der Version Oracle 11g funktioniert dies aus sqlplus heraus.
alter system disconnect session 'sid,serial#' POST_TRANSACTION;
alter system disconnect session 'sid,serial#' IMMEDIATE;
bzw im RAC
alter system disconnect session 'sid,serial#@inst_id' POST_TRANSACTION;
alter system disconnect session 'sid,serial#@inst_id' IMMEDIATE;
POST_TRANSACTION und IMMEDIATE sind Analogien zu TRANSACTIONAL und
IMMEDIATE im Shutdown befehlt.
POST_TRANSACTION wartet bis die Transaction durch ein commit oder
rollback abgeschlossen ist, während IMMEDIATE die Session direkt
beendet. Im letzteren Fall wird ein Recovery durchgeführt.
*Killen mit Betriebssystembefehlen*
Setzt man noch eine ältere Oracle Version ein, kann man die Session auch
mit Betriebssystembefehlen beenden.
*Windows*
C:> orakill ORACLE_SID <spid>
*UNIX,LINUX oder Max OS*
$ kill <spid>
Hat eine normal ausgeprägte Paranoia, wie sie bei Administratoren häufig
zu finden ist, empfiehlt es sich das Ergebnis der spid mittels folgendem
Befehl abzusichern und dann fortzufahren:
ps ahx | grep <spid>
Führt das nach einigen Minuten nicht zu Erfolg, kann man auch
$ kill -9 <spid>
in Betracht ziehen.
Die spid ist aus obigen Befehl zu entnehmende Operating sytem process
identifier.