[ORACLE] Oracleのロックの調査と解消(V$LOCK、V$SESSION、V$LOCKED_OBJECT)(ちょっと古いけど)

ロック競合が発生している可能性がある場合は、V$LOCK、V$SESSION、V$LOCKED_OBJECT(V$LOCKのビュー)でロックの情報を取得しALTER SYSTEM KILL SESSIONでセッションを開放しロックを開放します。セッション(SID)、ユーザー、オブジェクト及びプログラム等の項目を調査しロックの解消と原因を調べます。


ロックのセッション、ユーザ、オブジェクト及びプログラム名を表示

Select V$SESSION.SID, DBA_OBJECTS.OBJECT_NAME, V$SESSION.OSUSER, V$SESSION.PROGRAM
 From V$LOCKED_OBJECT
 Left Join DBA_OBJECTS on V$LOCKED_OBJECT.OBJECT_ID = DBA_OBJECTS.OBJECT_ID
 Left Join V$SESSION ON V$LOCKED_OBJECT.SESSION_ID = V$SESSION.SID
 Order By V$SESSION.SID, DBA_OBJECTS.OBJECT_NAME

Oracle8iの場合は、下記で参照します。

Select V$SESSION.SID, DBA_OBJECTS.OBJECT_NAME, V$SESSION.OSUSER, V$SESSION.PROGRAM
 From V$LOCKED_OBJECT, DBA_OBJECTS, V$SESSION
 Where V$LOCKED_OBJECT.OBJECT_ID = DBA_OBJECTS.OBJECT_ID(+)
 And V$LOCKED_OBJECT.SESSION_ID = V$SESSION.SID(+)
 Order By V$SESSION.SID, DBA_OBJECTS.OBJECT_NAME

ロックの基本情報を表示

Select SID,TYPE,LMODE,REQUEST,CTIME From V$LOCK Where TYPE IN ('TX','TM')

ロックを起こしているセッションのSQLを表示

Select V$SQLAREA.SQL_TEXT,V$SQLAREA.ADDRESS
 From V$SQLAREA, V$SESSION, V$LOCK
 Where V$SQLAREA.ADDRESS = V$SESSION.SQL_ADDRESS
 And V$SESSION.SID = V$LOCK.SID
 And V$LOCK.TYPE IN ('TX','TM')

ロックの解消

ロックの解消は、ロックが発生したセッションを開放します。
セッションの強制終了

alter system kill session 'sid,serial#';

コメント