Поиск виновника блокировки в Oracle. Скрипт.

При возникновении ошибки

ORA-00054: ресурс занят и задано его получение с параметром NOWAIT, либо истекло время ожидания
00054. 00000 — «resource busy and acquire with NOWAIT specified or timeout expired»
виновника блокировки можно найти запросом:
  1. select session_id,owner,name,osuser
  2. from DBA_DML_LOCKS,v$session
  3. where session_id = sid
  4.  
Более подробно
  1. select wait.sid waitSid,
  2. wait.UserName #b1b100;">as waitUser,
  3. wait.Machine #b1b100;">as waitMachine,
  4. wait.osuser #b1b100;">as waitOsuser,
  5. hold.sid holdSid,
  6. hold.UserName #b1b100;">as holdUser,
  7. hold.Machine #b1b100;">as holdMachine,
  8. hold.osuser #b1b100;">as holdOsuser,
  9. g.Mode_Requested,
  10. obj.name
  11. from
  12. dba_waiters g,
  13. v$session wait,
  14. v$session hold,
  15. sys.obj$ obj,
  16. v$session s
  17. where g.waiting_session=wait.SID and g.holding_session=hold.SID
  18. and s.sid = wait.SID
  19. and obj.OBJ#(+) = s.ROW_WAIT_OBJ#;
  20.  

Чтобы узнать какая сессия блокирует пакет:

  1. SELECT s.*,
  2. l.lock_type,
  3. l.mode_held,
  4. l.mode_requested,
  5. l.lock_id1,
  6. 'alter system kill session '''|| s.sid|| ','|| s.serial#|| ''' immediate;' kill_sid
  7. FROM dba_lock_internal l,
  8. v$session s
  9. WHERE s.sid = l.session_id
  10. AND UPPER(l.lock_id1) LIKE '%ПАКЕТ%'
  11. AND l.lock_type = 'Body Definition Lock'
  12.  

select nvl(S.USERNAME,'Internal') username,
nvl(S.TERMINAL,'None') terminal,
L.SID||','||S.SERIAL# Kill,
U1.NAME||'.'||substr(T1.NAME,1,20) tab,
decode(L.LMODE,1,'No Lock',
2,'Row Share',
3,'Row Exclusive',
4,'Share',
5,'Share Row Exclusive',
6,'Exclusive',null) lmode,
decode(L.REQUEST,1,'No Lock',
2,'Row Share',
3,'Row Exclusive',
4,'Share',
5,'Share Row Exclusive',
6,'Exclusive',null) request
from V$LOCK L,
V$SESSION S,
SYS.USER$ U1,
SYS.OBJ$ T1
where L.SID = S.SID
and T1.OBJ# = decode(L.ID2,0,L.ID1,L.ID2)
and U1.USER# = T1.OWNER#
and S.TYPE != 'BACKGROUND'
order by 1,2,5

select
(select username from v$session where sid=a.sid) blocker,
a.sid,
' is blocking ',
(select username from v$session where sid=b.sid) blockee,
b.sid
from v$lock a, v$lock b
where a.block = 1
and b.request > 0
and a.id1 = b.id1
and a.id2 = b.id2

Источники
http://www.sql.ru/forum/575475/nayti-vinovnika-blokirovki
20:06
10.67K
Нет комментариев. Ваш будет первым!
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.