web-dev-qa-db-ja.com

ORA-00054:リソースがビジーであり、NOWAITが指定されて取得しています

テーブルの更新中のスクリプトを削除しました。今、私が取得しているスクリプトを再実行すると、

ORA-00054:リソースがビジーであり、NOWAITが指定されて取得しています

テーブルがロックされていると思いますか?テーブルのロックを解除するにはどうすればよいですか?前もって感謝します。

29
wowrt

ステップ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

60
chyee

お待ち頂く事になりますが。強制終了されたセッションはトランザクションの途中であり、多くのレコードを更新しました。これらのレコードはロールバックする必要があり、バックグラウンドプロセスがそれを処理します。それまでは、触れたレコードを変更することはできません。

8
Rob van Wijk

情報ユーザー「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;
8
Abey Tom

セッションを強制終了すると、セッションは「KILLED」ステータスのまましばらくハングアップしますが、Oracleはその後クリーンアップします。

どうしても必要な場合は、OSプロセスも強制終了できます(v$process.spid)、保持していたロックをすべて解除します。

詳細については、 this を参照してください。

6
Jeffrey Kemp

状況に応じて、ロックされているテーブルは通常の操作の一部である可能性があり、ブロッキングトランザクションを強制終了することは望ましくありません。あなたがしたいことは、ステートメントが他のリソースを待つようにすることです。 Oracle 11gには設定可能なDDLタイムアウトがあります これに対処します。

10gを扱う場合は、より創造的になり、再試行を処理するPL/SQLを作成する必要があります。 Oracle 10gでORA-00054を回避する を参照してください。これにより、resource_busy例外が発生したときにステートメントが再実行されます。

3
Nick Kavadias