テーブルの更新中のスクリプトを削除しました。今、私が取得しているスクリプトを再実行すると、
ORA-00054:リソースがビジーであり、NOWAITが指定されて取得しています
テーブルがロックされていると思いますか?テーブルのロックを解除するにはどうすればよいですか?前もって感謝します。
ステップ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
お待ち頂く事になりますが。強制終了されたセッションはトランザクションの途中であり、多くのレコードを更新しました。これらのレコードはロールバックする必要があり、バックグラウンドプロセスがそれを処理します。それまでは、触れたレコードを変更することはできません。
情報ユーザー「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;
セッションを強制終了すると、セッションは「KILLED」ステータスのまましばらくハングアップしますが、Oracleはその後クリーンアップします。
どうしても必要な場合は、OSプロセスも強制終了できます(v$process.spid
)、保持していたロックをすべて解除します。
詳細については、 this を参照してください。
状況に応じて、ロックされているテーブルは通常の操作の一部である可能性があり、ブロッキングトランザクションを強制終了することは望ましくありません。あなたがしたいことは、ステートメントが他のリソースを待つようにすることです。 Oracle 11gには設定可能なDDLタイムアウトがあります これに対処します。
10gを扱う場合は、より創造的になり、再試行を処理するPL/SQLを作成する必要があります。 Oracle 10gでORA-00054を回避する を参照してください。これにより、resource_busy例外が発生したときにステートメントが再実行されます。