テーブルを更新している最中のスクリプトを強制終了しました。取得したスクリプトを再実行すると、
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、ユーザー名、マシン、ポート情報を調べて、接続を保持している実際のプロセスを取得することもできます
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;
お待ち頂く事になりますが。強制終了されたセッションはトランザクションの途中であり、多くのレコードを更新しました。これらのレコードはロールバックする必要があり、一部のバックグラウンド プロセスがそれを処理しています。その間、触れられたレコードを変更することはできません。
セッションを強制終了すると、Oracle がその後クリーンアップする間、セッションは「KILLED」ステータスでしばらくハングします。
絶対に必要な場合は、OS プロセスを強制終了することもできます (検索v$process.spid
)。これにより、保持していたロックが解放されます。
詳細については、これを参照してください。
状況によっては、ロックされているテーブルが通常の操作の一部である可能性があり、ブロックしているトランザクションを強制終了したくない場合があります。あなたがしたいことは、ステートメントが他のリソースを待つことです。Oracle 11g には、これに対処するため に設定できる DDL タイムアウトがあります。
10g を扱っている場合は、より創造的になり、再試行を処理する PL/SQL を作成する必要があります。Getting around ORA-00054 in Oracle 10g を見 てください。これにより、resource_busy 例外が発生したときにステートメントが再実行されます。