Добро пожаловать, Гость
Логин: Пароль: Запомнить меня
Теоретические аспекты и практические реализации создания, внедрения и использования баз данных, СУБД, хранилищ.
  • Страница:
  • 1
  • 2
  • 3
  • 4

ТЕМА: Как узнать причину блокировки

Как узнать причину блокировки 16 июль 2011 03:44 #1958

  • Nymbos
  • Nymbos аватар Автор темы
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 46
  • Спасибо получено: 0
Приветик.
У меня версия oracle 11.1
У меня в базе произошла большая блокиовка. Через v$session.blocking_session я без проблем могу определить, какая сессия всех заблокировала. В поле P2 иногда виден ID заблокированного объекта.

А можно ли как то определить, каким именно запросом сессия всех заблокировала?

Чаще всего блокирующая сессия неактивна и sql_id у нее пустой, а в prev_sql_id виден id какого-нибудь select-а, не имеющего отношения к заблокированному объекту.
Пробовал искать в v$active_session_history - там блокирующая сессия, как правило, вообще не находится.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Как узнать причину блокировки 16 июль 2011 03:51 #1959

  • Den
  • Den аватар
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 44
  • Спасибо получено: 0
Привет.
Не, к сожалению нельзя.
например строка может быть заблокирована разными DMLями, запросы могут быть вытеснены и т.д.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Как узнать причину блокировки 16 июль 2011 03:55 #1960

Привет!
А если логмайнером прошерстить логи, то при желании можно е вытащить команду? Или я ошибаюсь?

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Как узнать причину блокировки 16 июль 2011 03:57 #1961

SELECT (SELECT username
          FROM v$session
         WHERE sid = a.sid) AS "Кто блокирует",
       a.sid,  ' блокирует ',
      (SELECT username  FROM v$session WHERE sid = b.sid) AS "Кто заблокирован",
       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

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Как узнать причину блокировки 16 июль 2011 04:28 #1962

  • Nymbos
  • Nymbos аватар Автор темы
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 46
  • Спасибо получено: 0

А если логмайнером прошерстить логи, то при желании можно е вытащить команду?


А select for update туда попадает?

Polton, этот скрипт что-то долго у меня выполняется.
Я использую вот это:
set linesize 140
set pagesize 100
clear column
col sid format a15
col serial format a10
col os_pid format a10
col username format a12
col osuser format a10
col program format a16
col status format a8
col event format a20
col sql_id format a15
select bl.blocking_tree "SID"
,      to_char(ps.serial#) "SERIAL"
,      ps.os_pid
,      ps.username
,      ps.osuser
,      ps.program
,      ps.status
,      ps.event
,      ps.sql_id
from
(select rownum rn, blocking_tree,locked from (with locks as (select blocking_session locker , sid locked from v$session
     where blocking_session is not null)
SELECT LPAD(locked, LENGTH(locked)+(level*2-2), ' ') blocking_tree, locked
FROM   (SELECT * FROM locks
        UNION
        SELECT NULL, locker
        FROM locks
        WHERE locker NOT IN (SELECT locked FROM locks))
CONNECT BY PRIOR locked = locker
START WITH locker IS NULL)) bl,
(select  s.sid
,       s.serial#
,       s.username
,       s.osuser
,       p.spid "OS_PID"
,       s.program
,       s.status
,       s.event
,       s.sql_id
from    v$session s
,       v$process p
Where   s.paddr = p.addr
order   by status,username) ps
where bl.locked=ps.sid
order by bl.rn

но м.б. так не все блокировки ловятся?

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Как узнать причину блокировки 16 июль 2011 04:31 #1963

  • Den
  • Den аватар
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 44
  • Спасибо получено: 0
Polton, сессия 1 выполняет операторы в рамках ~ одного набора строк
update....
delete...
select for update....
.......
.......
insert

и тут вклинивается сессия, которая нарывается на блокировку.
Что ее блокирует?

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от Den.
  • Страница:
  • 1
  • 2
  • 3
  • 4