it-swarm.com.de

Wie zeige ich laufende Prozesse in Oracle DB an?

Ist es möglich, andere laufende Prozesse in einer Oracle-Datenbank anzuzeigen? So etwas wie Sybases sp_who

60
Robert Brown

Ich vermute, Sie möchten nur ein paar Spalten aus V $ SESSION und die SQL-Anweisung aus V $ SQL abrufen. Angenommen, Sie möchten die Hintergrundprozesse ausschließen, die Oracle selbst ausführt

SELECT sess.process, sess.status, sess.username, sess.schemaname, sql.sql_text
  FROM v$session sess,
       v$sql     sql
 WHERE sql.sql_id(+) = sess.sql_id
   AND sess.type     = 'USER'

Die äußere Verknüpfung behandelt die Sitzungen, die derzeit nicht aktiv sind, vorausgesetzt, Sie möchten diese Sitzungen. Sie können auch die sql_fulltext-Spalte von V $ SQL abrufen, die die vollständige SQL-Anweisung anstelle der ersten 1000 Zeichen enthält. Dies ist jedoch ein CLOB und daher wahrscheinlich etwas komplizierter zu handhaben.

Realistisch gesehen möchten Sie sich wahrscheinlich alles ansehen, was in V $ SESSION verfügbar ist, da Sie wahrscheinlich viel mehr Informationen erhalten können, als SP_WHO bietet.

82
Justin Cave

Nach sp_who hat Oracle diese Fähigkeit nicht per se. In Oracle werden mindestens 8 Prozesse ausgeführt, auf denen die Datenbank ausgeführt wird. Wie RMON etc.

Sie können die Datenbank fragen, welche Abfragen ausgeführt werden, nur eine Tabellenabfrage. Schauen Sie sich die V $ -Tabellen an.

Kurzes Beispiel:

SELECT sid,
       opname,
       sofar,
       totalwork,
       units,
       elapsed_seconds,
       time_remaining
FROM v$session_longops
WHERE sofar != totalwork;
5
jim

Dieser zeigt SQL, das derzeit "ACTIVE" ist: -

select S.USERNAME, s.sid, s.osuser, t.sql_id, sql_text
from v$sqltext_with_newlines t,V$SESSION s
where t.address =s.sql_address
and t.hash_value = s.sql_hash_value
and s.status = 'ACTIVE'
and s.username <> 'SYSTEM'
order by s.sid,t.piece
/

Dies zeigt Sperren. Manchmal geht es langsam voran, aber es liegt daran, dass es blockiert ist und auf ein Schloss wartet:

select
  object_name, 
  object_type, 
  session_id, 
  type,         -- Type or system/user lock
  lmode,        -- lock mode in which session holds lock
  request, 
  block, 
  ctime         -- Time since current mode was granted
from
  v$locked_object, all_objects, v$lock
where
  v$locked_object.object_id = all_objects.object_id AND
  v$lock.id1 = all_objects.object_id AND
  v$lock.sid = v$locked_object.session_id
order by
  session_id, ctime desc, object_name
/

Dies ist eine gute Methode, um lange Operationen zu finden (z. B. vollständige Tabellenscans). Wenn es sich um viele kurze Operationen handelt, wird nichts angezeigt.

COLUMN percent FORMAT 999.99 

SELECT sid, to_char(start_time,'hh24:mi:ss') stime, 
message,( sofar/totalwork)* 100 percent 
FROM v$session_longops
WHERE sofar/totalwork < 1
/
4
WW.

Beachten Sie, dass sich in der Datenbank Prozesse befinden, die eine Sitzung derzeit möglicherweise nicht unterstützen.

Wenn Sie an allen Prozessen interessiert sind, sollten Sie sich v $ process (oder gv $ process auf RAC) ansehen.

1
Ryan