如何在Oracle数据库中显示正在运行的进程?

66

在 Oracle 数据库中是否有可能显示其他进程的进度?类似于 Sybase 的 sp_who 命令。

4个回答

91
我猜您只需从V$SESSION中获取几列和从V$SQL中获取SQL语句。假设您想要排除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'

外连接用于处理那些当前没有活动的会话,如果您需要这些信息的话。您还可以从V$SQL中获取sql_fulltext列,这将显示完整的SQL语句而不是前1000个字符,但这是一个CLOB,所以可能会更加复杂。

实际上,您可能想查看在V$SESSION中提供的所有可用信息,因为很可能您可以获得比SP_WHO提供的更多信息。


11
如果您需要快速查看长时间运行的查询,可以在SELECT语句中添加 sql.elapsed_time / 1000000 ,并加上约束条件 WHERE ... AND sql.elapsed_time IS NOT NULL,最后通过 ORDER BY sql.elapsed_time DESC 进行排序。 - Maxime Pacary
1
选择 * 从 v$sql 第1行出现错误: ORA-00942:表或视图不存在 - Ole Tange
@OleTange 那么你的数据库管理员没有在该视图上授予你权限。你需要请求他或她这样做。 - Justin Cave

5

在查看sp_who之后,Oracle本身没有这种能力。 Oracle至少有8个运行中的进程来运行数据库,例如RMON等。

你可以询问DB正在运行哪些查询,因为那只是一个表查询。 查看V$表格。

快速示例:

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

5

这段代码显示当前处于“ACTIVE”状态的SQL:

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
/

这里展示了锁。有时候事情进展缓慢,但这是因为正在等待锁的解除阻塞:
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
/

这是一个很好的工具,可以找到长时间操作(例如全表扫描)。 如果是由于许多短操作引起的,则不会显示任何内容。

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
/

2

请注意,数据库中可能存在一些当前不支持会话的进程。

如果您对所有进程感兴趣,您可以查看v$process(或在RAC上查看gv$process)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接