查詢oracle正在執行的SQL和事務

ywxj_001發表於2018-03-05
查詢Oracle正在執行的sql語句及執行該語句的使用者:
SELECT b.sid oracleID,  
       b.username 登入Oracle使用者名稱,  
       b.serial#,  
       spid 作業系統ID,  
       paddr,  
       sql_text 正在執行的SQL,  
       b.machine 計算機名  
FROM v$process a, v$session b, v$sqlarea c  
WHERE a.addr = b.paddr  
   AND b.sql_hash_value = c.hash_value

檢視正在執行sql的發起者的發放程式:
SELECT OSUSER 電腦登入身份,  
       PROGRAM 發起請求的程式,  
       USERNAME 登入系統的使用者名稱,  
       SCHEMANAME,  
       B.Cpu_Time 花費cpu的時間,  
       STATUS,  
       B.SQL_TEXT 執行的sql  
FROM V$SESSION A  
LEFT JOIN V$SQL B ON A.SQL_ADDRESS = B.ADDRESS  
                   AND A.SQL_HASH_VALUE = B.HASH_VALUE  
ORDER BY b.cpu_time DESC

查出oracle當前的被鎖物件:
SELECT l.session_id sid,  
       s.serial#,  
       l.locked_mode 鎖模式,  
       l.oracle_username 登入使用者,  
       l.os_user_name 登入機器使用者名稱,  
       s.machine 機器名,  
       s.terminal 終端使用者名稱,  
       o.object_name 被鎖物件名,  
       s.logon_time 登入資料庫時間  
FROM v$locked_object l, all_objects o, v$session s  
WHERE l.object_id = o.object_id  
   AND l.session_id = s.sid  
ORDER BY sid, s.serial#;

kill掉當前的鎖物件:
alter system kill session 'sid, s.serial#‘;

查詢當前正在執行的事務:
SELECT s.sid,  
      s.serial#,  
      s.event,  
      a.sql_text,  
      a.sql_fulltext,  
      s.username,  
      s.status,  
      s.machine,  
      s.terminal,  
      s.program,  
      a.executions,  
      s.sql_id,  
      p.spid,  
      a.direct_writes  
 FROM (SELECT * FROM v$session WHERE status = 'ACTIVE') s  
 LEFT JOIN v$sqlarea a  
   ON s.sql_id = a.sql_id  
INNER JOIN v$process p  
   ON s.paddr = p.addr


檢視Oracle 資料庫中的長事務:
set linesize 200  
set pagesize 5000  
col transaction_duration format a45  
  
with transaction_details as  
( select inst_id  
  , ses_addr  
  , sysdate - start_date as diff  
  from gv$transaction  
)  
select s.username  
, to_char(trunc(t.diff))  
             || ' days, '  
             || to_char(trunc(mod(t.diff * 24,24)))  
             || ' hours, '  
             || to_char(trunc(mod(t.diff * 24 * 60,24)))  
             || ' minutes, '  
             || to_char(trunc(mod(t.diff * 24 * 60 * 60,60)))  
             || ' seconds' as transaction_duration  
, s.program  
, s.terminal  
, s.status  
, s.sid  
, s.serial#  
from gv$session s  
, transaction_details t  
where s.inst_id = t.inst_id  
and s.saddr = t.ses_addr  
order by t.diff desc  
/

查詢長事務SQL:
下面SQL 查詢資料庫中正在執行大於N秒的事務資訊:
with ltr as ( 
select to_char(sysdate,'YYYYMMDDHH24MISS') TM, 
       s.sid, 
       s.sql_id, 
       s.sql_child_number, 
       s.prev_sql_id, 
       xid, 
       to_char(t.start_date,'YYYYMMDDHH24MISS') start_time, 
       e.TYPE,e.block, 
       e.ctime, 
       decode(e.CTIME, 0, (sysdate - t.start_date) * 3600*24, e.ctime) el_second  
     --  q.sql_text 
  from v$transaction t, v$session s,v$transaction_enqueue e
 where t.start_date <= sysdate - interval '100' second     /*查詢開始多少秒的事務*/
   and t.addr = s.taddr 
   --and s.sql_child_number = q.CHILD_NUMBER(+) 
   --and s.sql_id = q.sql_id(+) and s.prev_sql_id = q.sql_id(+) 
   and t.addr = e.addr(+) )  
  select ltr.* , (select q1.sql_text from v$sql q1 where ltr.prev_sql_id = q1.sql_id(+)
   and rownum = 1) prev_sql_text , 
  (select q1.sql_text from v$sql q1 where ltr.sql_id = q1.sql_id(+) 
   and ltr.sql_child_number = q1.CHILD_NUMBER(+)) sql_text 
   from ltr ltr;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22996654/viewspace-2151533/,如需轉載,請註明出處,否則將追究法律責任。

相關文章