web-dev-qa-db-fra.com

Comment puis-je afficher les processus en cours d'exécution dans Oracle DB?

Est-il possible d'afficher d'autres processus en cours sur une base de données Oracle? Quelque chose comme Sybases sp_who

60
Robert Brown

Je suppose que vous souhaitez simplement récupérer quelques colonnes de V $ SESSION et l’instruction SQL de V $ SQL. En supposant que vous souhaitiez exclure les processus d’arrière-plan exécutés par Oracle

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'

La jointure externe doit gérer les sessions qui ne sont pas actuellement actives, en supposant que vous les souhaitiez. Vous pouvez également obtenir la colonne sql_fulltext auprès de V $ SQL qui contiendra l’instruction SQL complète plutôt que les 1 000 premiers caractères, mais c’est un CLOB et donc un peu plus compliqué à gérer.

De manière réaliste, vous souhaiterez probablement examiner tout ce qui est disponible dans V $ SESSION car il est probable que vous obtiendrez beaucoup plus d'informations que celles fournies par SP_WHO.

82
Justin Cave

Après avoir examiné sp_who, Oracle n’a pas cette capacité en soi. Oracle a au moins 8 processus en cours d'exécution exécutant la base de données. Comme RMON etc.

Vous pouvez demander à la base de données quelles requêtes sont en cours d'exécution en tant que requêtes de table. Regardez les tables V $.

Exemple rapide:

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

Celui-ci montre SQL qui est actuellement "ACTIVE": -

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
/

Cela montre les serrures. Parfois, les choses vont lentement, mais c'est parce qu'il est bloqué dans l'attente d'un verrou:

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
/

C’est un bon moyen de rechercher des opérations longues (par exemple, des balayages de table complets). Si c'est à cause de nombreuses opérations courtes, rien ne se présentera.

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.

N'oubliez pas que la base de données contient des processus qui ne prennent peut-être pas en charge une session.

Si vous êtes intéressé par tous les processus, vous voudrez probablement regarder v $ process (ou gv $ process sur RAC).

1
Ryan