ORA-00054: ресурс занят и приобретается с помощью NOWAIT
Я убил script, который был посередине обновления таблицы. Теперь, когда я перезапускаю script, я получаю,
ORA-00054: ресурс занят и приобретается с указанным NOWAIT
Я полагаю, что таблица заблокирована?. Как разблокировать таблицу?. Спасибо заранее.
Ответы
Ответ 1
Шаг 1:
select object_name, s.sid, s.serial#, p.spid
from v$locked_object l, dba_objects o, v$session s, v$process p
where l.object_id = o.object_id and l.session_id = s.sid and s.paddr = p.addr;
Шаг 2:
alter system kill session 'sid,serial#'; --'sid' and 'serial#' get from step 1
Дополнительная информация: http://www.oracle-base.com/articles/misc/killing-oracle-sessions.php
Ответ 2
Вам придется подождать. Сессия, которая была убита, была в середине транзакции и обновила множество записей. Эти записи должны быть отменены, и некоторые фоновые процессы позаботятся об этом. Тем временем вы не можете изменять записи, которые были затронуты.
Ответ 3
Спасибо за информацию пользователя user712934 '
Вы также можете найти информацию о sql, username, machine, port и перейти к фактическому процессу, который содержит соединение
SELECT O.OBJECT_NAME, S.SID, S.SERIAL#, P.SPID, S.PROGRAM,S.USERNAME,
S.MACHINE,S.PORT , S.LOGON_TIME,SQ.SQL_FULLTEXT
FROM V$LOCKED_OBJECT L, DBA_OBJECTS O, V$SESSION S,
V$PROCESS P, V$SQL SQ
WHERE L.OBJECT_ID = O.OBJECT_ID
AND L.SESSION_ID = S.SID AND S.PADDR = P.ADDR
AND S.SQL_ADDRESS = SQ.ADDRESS;
Ответ 4
Когда вы убили сеанс, сеанс некоторое время зависает в статусе "KILLED", после чего Oracle очищается после него.
Если вам абсолютно необходимо, вы также можете убить процесс ОС (посмотрите v$process.spid
), который выпустит любые блокировки, на которые он держал.
Подробнее см. для более подробной информации.
Ответ 5
В зависимости от вашей ситуации блокировка таблицы может быть частью нормальной работы, и вы не хотите просто убивать транзакцию блокировки.
То, что вы хотите сделать, - заставить ваш оператор ждать другого ресурса. Oracle 11g имеет тайм-ауты DDL, которые можно установить, чтобы справиться с этим.
Если вы имеете дело с 10g, вам нужно получить больше креатива и написать PL/SQL для обработки повторной попытки. Посмотрите Обход ORA-00054 в Oracle 10g Это повторяет выполнение вашего оператора, когда возникает исключение resource_busy.