29

テーブルを更新している最中のスクリプトを強制終了しました。取得したスクリプトを再実行すると、

ORA-00054:リソースがビジーで、NOWAITを指定して取得します

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

4

5 に答える 5

63

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

于 2011-09-23T07:19:06.003 に答える
11

ユーザー「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;
于 2012-08-10T03:17:05.797 に答える
8

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

于 2010-06-19T15:26:54.697 に答える
6

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

絶対に必要な場合は、OS プロセスを強制終了することもできます (検索v$process.spid)。これにより、保持していたロックが解放されます。

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

于 2010-06-20T06:47:04.757 に答える
3

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

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

于 2015-12-27T15:07:10.113 に答える