ORA-00054: ресурс занят и получен с указанным NOWAIT - PullRequest
29 голосов
/ 19 июня 2010

Я убил скрипт, который был в процессе обновления таблицы.Теперь, когда я повторно запускаю получаемый скрипт,

ORA-00054: ресурс занят и получен с указанным значением NOWAIT

Я предполагаю, что таблица заблокирована ?.Как разблокировать стол?Заранее спасибо.

Ответы [ 5 ]

59 голосов
/ 23 сентября 2011

Шаг 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-сеансов.php

8 голосов
/ 10 августа 2012

Спасибо за информацию пользователю 'user712934'

Вы также можете посмотреть информацию о sql, имени пользователя, машине, порте и перейти к фактическому процессу, который удерживает соединение

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;
8 голосов
/ 19 июня 2010

Вам придется подождать. Сеанс, который был убит, был в середине транзакции и обновил много записей. Эти записи необходимо откатить, и некоторые фоновые процессы позаботятся об этом. В то же время вы не можете изменять записи, которые были затронуты.

6 голосов
/ 20 июня 2010

Когда вы прервали сеанс, сеанс некоторое время зависает в состоянии «KILLED», в то время как Oracle очищается после него.

Если вам абсолютно необходимо, вы также можете убить процесс ОС (посмотрите v$process.spid), что снимет все блокировки, к которым он привязан.

См. это для более подробной информации.

3 голосов
/ 27 декабря 2015

В зависимости от вашей ситуации блокируемая таблица может быть просто частью обычной операции, и вы не хотите просто убивать блокирующую транзакцию.Что вы хотите сделать, так это попросить ваше заявление подождать другого ресурса. Oracle 11g имеет тайм-ауты DDL, которые можно установить , чтобы справиться с этим.

Если вы имеете дело с 10g, вам нужно проявить больше творчества и написать PL / SQL для повторной попытки.Посмотрите на Обход ORA-00054 в Oracle 10g Это перезапустит ваш оператор при возникновении исключения resource_busy.

...