稼働中のサーバで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’;
いざという時に慌てなくて済みます。 🙄