Sunday, October 11, 2020

Blocking session script for Oracle

Below code is used to find the blocker and waiters in the Oracle Database.

code:-

select chn_id,sid,ses_serial,status,blkr_sid,Final_BLK_SES,wait_event,Process,osuser,sql_id,Machine,program,Wait_Secs,sql_text from (SELECT wc.chain_id CHN_ID,
 wc.sid,
  wc.sess_serial# ses_serial,
 CASE
   WHEN DECODE(blocker_sid,NULL,'',blocker_sid) IS NULL
   THEN 'blocker'
   ELSE 'waiter'
 END AS status,
  DECODE(blocker_sid,NULL,'',blocker_sid) blkr_sid,
  s.final_blocking_session Final_BLK_SES,
  wait_event_text wait_event,
  s.Process,
  s.osuser,
  s.sql_id,
 SUBSTR(s.machine,1,INSTR(s.machine,'.',1)-1) Machine ,
 SUBSTR(s.program,1,INSTR(s.program,'.',1)-1) program,
  in_wait_secs Wait_Secs
 ,dbms_lob.substr(q.sql_text,50,1) sql_text
FROM v$wait_chains wc, gv$session s,gv$session bs,gv$instance i,gv$process p ,gv$sql q
WHERE wc.instance              = i.instance_number (+)
AND s.sql_id                   =q.sql_id(+)
AND (wc.instance               = s.inst_id (+)
AND wc.sid                     = s.sid
AND wc.sess_serial#            = s.serial# (+))
AND (s.final_blocking_instance = bs.inst_id (+)
AND s.final_blocking_session   = bs.sid (+))
AND (bs.inst_id                = p.inst_id (+)
AND bs.paddr                   = p.addr (+))
AND ( num_waiters              > 0
OR ( blocker_osid             IS NOT NULL
AND in_wait_secs               > 10 ) ) ---- change here for secs in wait
  CONNECT BY PRIOR wc.sid      = blocker_sid
AND PRIOR wc.sess_serial#      = blocker_sess_serial#
AND PRIOR i.inst_id            = blocker_instance
  START WITH blocker_is_valid  = 'FALSE')
  group by chn_id,sid,ses_serial,status,blkr_sid,Final_BLK_SES,wait_event,Process,osuser,sql_id,Machine,program,Wait_Secs,sql_text
  ORDER BY chn_id,wait_secs DESC;



Thank you,
Sivaram

No comments:

Post a Comment

PostgreSql: Useful Commands-

 1)   ************************* Users ***************************  -- List of users with roles assigned: SELECT usename AS role_name,   CASE...