-- all sessions involved in blocking
-- - blocked sessions
select *
from v$session ses
where ses.blocking_session is not null
union
-- - blockers
select *
from v$session ses
where sid in ( select blocking_session from v$session where blocking_session is not null )
;
-- find root blocker
select 'alter system kill session '''||sid||','||serial#||''' immediate;' kill_db_cmd
, 'kill -9 '||process as kill_os_cmd
, s.*
from v$session s
where sid in (
select blocking_session
from v$session
)
and blocking_session is null
--and username = 'DBUSER'
--and osuser = 'osuser'
;
-- ddl lock information
select dlk.session_id
, ses.serial#
, ses.username
, ses.schemaname
, ses.machine
, ses.logon_time
, dlk.owner
, dlk.name
, dlk.type
, dlk.mode_held
, dlk.mode_requested
, 'alter system kill session '''||ses.sid||','||ses.serial#||''' immediate;'
from dba_ddl_locks dlk
inner join v$session ses
on dlk.session_id = ses.sid
where (mode_held <> 'Null' or mode_requested <> 'None')
order by dlk.session_id
;
-- library cache lock information
select distinct ses.ksusenum as sid
, ses.ksuseser as serial#
, ses.ksuudlna as username
, ses.ksusemnm as module
, obj.kglnaown as object_owner
, obj.kglnaobj as object_name
, lck.kgllkcnt as lock_count
, lck.kgllkmod as lock_mode
, lck.kgllkreq as lock_req
, swt.state as wait_state
, swt.event as wait_event
, swt.seconds_in_wait as sec_in_wait
from x$kgllk lck -- library object locks (both held and requested)
, x$kglob obj -- objects
, x$ksuse ses -- sessions
, v$session_wait swt -- session wait
where lck.kgllkreq > 0 -- a lock is requested
and obj.kglhdadr = lck.kgllkhdl
and lck.kgllkuse = ses.addr
and swt.sid = ses.indx
order by swt.seconds_in_wait desc
;
sta ?/rdbms/admin/utllockt
--WAITING_SESSION LOCK_TYPE MODE_REQUESTED MODE_HELD LOCK_ID1 LOCK_ID2
------------------- ----------------- -------------- -------------- ----------------- -----------------
--524 None
-- 511 Transaction Exclusive Exclusive 1835044 8310
-- it might also be of interest to look into ash
-- history, query coordinator, etc
select *
from v$active_session_history
where time_waited > 0
;
-- displays a row for each lock or latch that is being held, and one row for each outstanding request for a lock or latch.
-- http://download.oracle.com/docs/cd/B14117_01/server.101/b10755/statviews_2210.htm
select *
from dba_lock_internal
;
-- all locked objects
select oracle_username
, os_user_name
, session_id
, locked_mode
, object_name
, object_type
from v$locked_object lob
, dba_objects obj
where lob.object_id = obj.object_id
order by oracle_username
, os_user_name
, session_id
;
-- enqueues
select sid
, event
, chr(bitand(p1,-16777216)/16777215)|| chr(bitand(p1, 16711680)/65535) "type"
, mod(p1,16) as "mode"
, p2
, p3
from v$session_wait
where event like 'enq%'
;
-- cumulated statistics on enqueues
select *
from v$enqueue_statistics
;
-- see who accesses an object
select *
from v$access
where object like 'BLA'
;
-- oradebug dump systemstate
-- - shows complete dump of all processes including locks held/requested
-- - dump created in user dump dest
-- - connect as sysdba
oradebug setmypid
oradebug unlimit
oradebug dump systemstate 266
oradebug tracefile_name
Links / References:
- MOS: How to Find which Session is Holding a Particular Library Cache Lock [ID 122793.1]
- http://orainternals.wordpress.com/2009/06/02/library-cache-lock-and-library-cache-pin-waits/
- http://www.evdbt.com/enqwaits.sql
- http://www.perfvision.com/papers/09_enqueues.ppt
No comments:
Post a Comment