Oracleのロック競合が発生したと思われた時の対応

稼働中のサーバでOracleのロック競合が発生・・・・

原因は特定できてもこのまま放置も出来ず、
かつサーバを再起動させるわけにもいかない状況で・・・・
あちらこちらをググってMy備忘録へ。

 

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

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
;

 

2.ロックの基本情報を表示

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

 

3.ロックを起こしているセッションの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’)
;

 

4.ロックを起こしているセッションとシリアルを表示

SELECT SID, SERIAL# FROM V$SESSION
WHERE SID IN (SELECT SID FROM V$LOCK
WHERE TYPE IN (‘TM’,’TX’))
;

 

5.ロックの解消 (セッションの強制終了) ←DBA権限が必要

alter system kill session ‘sid,serial#’
;

例):alter system kill session ‘196, 5’;

 

いざという時に慌てなくて済みます。 🙄

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA