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

ТЕМА:

Как узнать причину блокировки 12 года 9 мес. назад #1958

Приветик.
У меня версия oracle 11.1
У меня в базе произошла большая блокиовка. Через v$session.blocking_session я без проблем могу определить, какая сессия всех заблокировала. В поле P2 иногда виден ID заблокированного объекта.

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

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

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

Re: Как узнать причину блокировки 12 года 9 мес. назад #1959

Привет.
Не, к сожалению нельзя.
например строка может быть заблокирована разными DMLями, запросы могут быть вытеснены и т.д.

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

Re: Как узнать причину блокировки 12 года 9 мес. назад #1960

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

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

Re: Как узнать причину блокировки 12 года 9 мес. назад #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: Как узнать причину блокировки 12 года 9 мес. назад #1962

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


А 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: Как узнать причину блокировки 12 года 9 мес. назад #1963

Polton, сессия 1 выполняет операторы в рамках ~ одного набора строк
update....
delete...
select for update....
.......
.......
insert

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

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

Последнее редактирование: от Den.
  • Страница:
  • 1
  • 2
  • 3
  • 4
Время создания страницы: 0.222 секунд