Benutzer-Werkzeuge

Webseiten-Werkzeuge


dba:kill_disconnect_session

Eine Oracle Session beenden - Kill Session / Disconnect Session

Einen User in der Oracle Datenbank identifizieren

Wird über einen „Dedicated Server Prozess“ eine Verbindung mit der Datenbank aufgebaut, lassen sich die die Anwender Prozesse, die mit der Datenbank verbunden sind, über die View V$SESSION identifizieren.

Script aufrufen mit dem gesuchten Usernamen und N für das ausblenden der Hintergrund Prozesse (sqlplus>@sessions.sql SYS N):

sessions.sql
define USER_NAME   =  &1
define ALL_PROCESS = '&2'
 
prompt
prompt Parameter 1 = Username          => &&USER_NAME.
prompt Parameter 2 = TO SHOW ALL USE Y => &&ALL_PROCESS.
prompt
 
 
SET verify off
 
SET linesize 140 pagesize 300 recsep OFF
 
ttitle LEFT  "All User Sessions on this DB" skip 2
 
 
COLUMN inst_id    format 99     heading "Inst|ID"
COLUMN username   format a14     heading "DB User|name"
COLUMN sid        format 99999  heading "SID"
COLUMN serial#    format 99999  heading "Serial"
COLUMN machine    format a30    heading "Remote|pc/server"
COLUMN terminal   format a13    heading "Remote|terminal"
COLUMN program    format a16    heading "Remote|program"
COLUMN module     format a16    heading "Remote|module"
COLUMN client_info format a10   heading "Client|info"
COLUMN client_identifier format A10 heading "Client|identifier"
COLUMN OSUSER      format a13 heading "OS|User"
COLUMN LOGON_TIME  format a12 heading "Logon|Time"
COLUMN STATUS      format a8  heading "Status"
 
SELECT  inst_id 
      , sid
	   , serial#
	   , STATUS
      , username
	   , machine
      --, terminal
      , program
		, OSUSER
	   , module
		, to_char(LOGON_TIME,'dd.mm hh24:mi') AS LOGON_TIME
     , client_identifier
	  , client_info	  
  FROM gv$session 
 WHERE  ( username LIKE UPPER('%&&USER_NAME.%') OR ( nvl('&ALL_PROCESS.','N')='Y' AND username IS  NULL))
 --and program not like '%(P%)%'
 ORDER BY program
         ,inst_id
/
 
ttitle LEFT  "User Sessions Summary on this DB" skip 2
 
COLUMN cs format 9999
COLUMN program  format A60
COLUMN username format A20
 
COLUMN DUMMY NOPRINT;
COMPUTE SUM OF cs ON DUMMY
BREAK ON DUMMY;
 
SELECT  NULL dummy
      , COUNT(*) AS cs
      , username
      , program
  FROM gv$session
 WHERE username IS NOT NULL
 GROUP BY username
         ,program
 ORDER BY username
/
 
ttitle off
 
SHOW parameter sessions
 
prompt
prompt ... TO KILL SESSION     "ALTER SYSTEM KILL SESSION 'sid,serial#,@inst_id';"
prompt ... TO END  SESSION     "ALTER SYSTEM DISCONNECT SESSION 'sid,serial#' IMMEDIATE;"
prompt

siehe auch sessions.sql

Eine Sessoin beenden

Ist die SID, die SERIAL# und die Instance ID bekannt, kann die Session auf zwei Arten über SQL*Plus beendet werden:

  • „ALTER SYSTEM KILL SESSION 'sid,serial#,@inst_id';“
  • „ALTER SYSTEM DISCONNECT SESSION 'sid,serial#' IMMEDIATE;“
Unterschied zwischen KILL SESSION und DISCONNECT SESSION

Wird eine Session mit „ALTER SYSTEM DISCONNECT SESSION“ beendet, wird der dazugehörige User Prozess gleich mit beendet. Bei einem Kill wird die Session nur markiert und abgehängt, der PMON räumt dann später auf.

OS Prozess beenden

Alternativ kann auch der Prozess der Session mit OS Mitteln hart beendet werden:

  • Windows: orakill ORACLE_SID spid
  • Linux: kill -9 <spid>

Eine gekillete Session in der DB "wiederfinden"

Wenn eine Session mit „kill Session“ beendet wird wird das Session Objekt (und alle abhängigen Objeckte unter der Session) vom original Eltern Prozesse abgehängt und unter einen „PSEUDO“ Prozess gehängt.

Der PMON Prozess prüft regelmäßig auf diese „PSEUDO“ Prozesse und bereinigt diese.

Dies hat aber zur Folge das unter der ursprüngliche PADDR Adresse in der V$SESSION der Prozess nicht mehr gefunden werden kann, eine neue PADDR wird vergeben.

Um das nun nach zuverfolgen stehen in der V$SESSION diese Spalten zur Verfügung:

  • CREATOR_ADDR - state object address of creating process
  • CREATOR_SERIAL# - serial number of creating process

Mit der CREATOR_ADDR kann nun die ADDR Spalte in der V$PROCESS gejoined werden um den gekillten Prozess der alten Session wieder zu finden

ab 11g 11.1.0.6

Folgende zwei neue Views helfen die Session besser wieder zu finden:

V$PROCESS_GROUP

  • INDX - Index
  • NAME - The name of the process group. The default group is called DEFAULT.
  • PID - Oracle process id

V$DETACHED_SESSION

  • INDX - Index
  • PG_NAME - The process group name that owns this session. The default group is DEFAULT.
  • SID - Oracle session id.
  • SERIAL# - Session serial number.
  • PID - Oracle process id.
ttitle LEFT "Processes without entries in the v$session" skip 2
 
 
COLUMN process_id format a8     heading "Process|ID"
COLUMN inst_id    format 99     heading "Inst|ID"
COLUMN username   format a8     heading "DB User|name"
COLUMN osusername   format a8   heading "OS User|name"
COLUMN pname       format a8    heading "Process|name"
 
SELECT --p.inst_id  
      to_char(p.spid) AS process_id
	 , p.username AS osusername
	 , p.pname			
	 , p.program
FROM v$process p
 WHERE p.program!= 'PSEUDO' 
   AND p.addr NOT IN (SELECT gv.paddr FROM v$session gv)
   AND p.addr NOT IN (SELECT bg.paddr FROM v$bgprocess bg)
   AND p.addr NOT IN (SELECT ss.paddr FROM v$shared_server ss)
--order by p.inst_id 
/	 
 
-- new column creator_addr in v$session!
 
ttitle LEFT  "get the prozess of a killed session with the help of the creator_addr" skip 2
 
 
SELECT --p.inst_id  
      to_char(p.spid) AS process_id
	 , p.username AS osusername
	 , p.pname			
	 , p.program
FROM v$process p
 WHERE p.addr IN (SELECT gv.creator_addr FROM v$session gv WHERE STATUS IN ('KILLED') )
/	
 
ttitle off

SNIPED Sessions

..

Sniped - the session has passed the idle_time limit defined in user profile. The session will remain snipped until the client communicates with the db again, when it will get „ORA-02396: exceeded maximum idle time, please connect again“ and the session is removed from v$session.

When IDLE_TIME is set in the users' profiles or the default profile. This will kill the sessions in the database (status in v$session now becomes SNIPED) and they will eventually disconnect. It does not always clean up the Unix session (LOCAL=NO sessions). At this time all oracle resources are released but the shadow processes remains and OS resources are not released. This shadow process is still counted towards the parameters of init.ora. This process is killed and entry from v$session is released only when user again tries to do something. Another way of forcing disconnect (if your users come in via SQL*Net) is to put the file sqlnet.ora on every client machine and include the parameter „SQLNET.EXPIRE_TIME“ in it to force the close of the SQL*Net session.

see https://community.oracle.com/thread/531765

In Arbeit

Quellen

Netz:

Oracle Support:

  • How To Find The Process Identifier (pid, spid) After The Corresponding Session Is Killed? (Doc ID 387077.1)
Cookies helfen bei der Bereitstellung von Inhalten. Durch die Nutzung dieser Seiten erklären Sie sich damit einverstanden, dass Cookies auf Ihrem Rechner gespeichert werden. Weitere Information
"Autor: Gunther Pipperr"
dba/kill_disconnect_session.txt · Zuletzt geändert: 2015/01/16 16:23 von Gunther Pippèrr