【问题标题】:How do I show running processes in Oracle DB?如何在 Oracle DB 中显示正在运行的进程?
【发布时间】:2010-09-17 00:04:59
【问题描述】:

是否可以显示 Oracle 数据库上正在进行的其他进程?像 Sybases sp_who

【问题讨论】:

    标签: oracle process


    【解决方案1】:

    这个显示的是当前“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)

      【讨论】:

        【解决方案3】:

        查看 sp_who 后,Oracle 本身并没有这种能力。 Oracle 至少有 8 个运行 db 的进程在运行。像 RMON 等。

        您可以询问数据库正在运行哪些查询,因为这只是一个表查询。查看 V$ 表。

        快速示例:

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

        【讨论】:

          【解决方案4】:

          我怀疑您只想从 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 提供的更多信息。

          【讨论】:

          • 如果需要快速查看长时间运行的查询,可以在SELECT中添加sql.elapsed_time / 1000000,加上约束WHERE ... AND sql.elapsed_time IS NOT NULL,最后是ORDER BY sql.elapsed_time DESC
          • select * from v$sql ERROR at line 1: ORA-00942: table or view does not exist
          • @OleTange 那么您的 DBA 没有授予您对该视图的权限。您需要请他或她这样做。
          猜你喜欢
          • 1970-01-01
          • 2017-04-30
          • 1970-01-01
          • 2023-04-08
          • 1970-01-01
          • 2011-06-03
          • 1970-01-01
          • 2019-03-26
          • 1970-01-01
          相关资源
          最近更新 更多