Inhaltsbereich

Suchen, finden und beenden einer Oracle-Session

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 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

11077        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

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.

 

 

 

Rechter Inhaltsbereich

eXirius IT Dienstleistungen GmbH
Juchem-Straße 24
66571 Eppelborn

Telefon: +49 (6881) 99 99 5 - 0
Fax:        +49 (6881) 99 99 5 - 77

E-Mail: info(at)exirius.de