1. 根据event事件获取对应session在v$session中等待的row_wait_object#,row_wait_file#,row_wait_block#,row_wait_row#
SQL> select a.SID,
2 a.USERNAME,
3 a.ROW_WAIT_OBJ#,
4 a.ROW_WAIT_FILE#,
5 a.ROW_WAIT_BLOCK#,
6 a.ROW_WAIT_ROW#
7 from v$session a
8 where a.username is not null
9 and a.EVENT = 'enq: TX - row lock contention';
SID USERNAME ROW_WAIT_OBJ# ROW_WAIT_FILE# ROW_WAIT_BLOCK# ROW_WAIT_ROW#
---------- ------------------------------ ------------- -------------- --------------- -------------
62 TEST 88076 4 276 14
row_wait_obj# --等待对象的object_id
row_wait_file# --等待对象的文件号
row_wait_block# --等待对象的块号
row_wait_row# --等待对象的行号
参考session信息脚本:select nvl(s.username, 'None') oracle_user,
s.logon_time,
p.username unix_user,
s.sid,
s.serial#,
p.spid unix_pid,
s.status,
s.process,
s.osuser,
s.program,
s.module,
s.machine,
s.event,
s.ROW_WAIT_OBJ#,
s.ROW_WAIT_FILE#,
s.ROW_WAIT_BLOCK#,
s.ROW_WAIT_ROW#,
-- TO_CHAR(sysdate - (s.last_call_et) / 86400, 'mm/dd/yy hh24:mi:ss') as last_txn,
l.SQL_TEXT,
s.sql_id,
s.prev_sql_id,
'ps -ef|grep ' || p.spid ||
'|grep LOCAL=NO|awk ''{print $2}''|xargs kill -9' kill_sh
from v$process p, v$session s, v$sql l
where s.paddr = p.addr
and s.SQL_ADDRESS = l.ADDRESS(+)
and s.SQL_HASH_VALUE = l.HASH_VALUE(+)
and s.sql_child_number = l.child_number(+)
and s.EVENT = 'enq: TX - row lock contention'
/* and s.sid = 2445;*/
2. 获取等待记录的rowid号
SQL> select dbms_rowid.rowid_create(1,88076,4,276,14) from dual;
DBMS_ROWID.ROWID_C
------------------
AAAVgMAAEAAAAEUAAO
dbms_rowid.rowid_creat(1,(dba_objects:data_object_id),ROW_WAIT_FILE#,ROW_WAIT_BLOCK#,ROW_WAIT_ROW#)
注意:dbms_rowid.rowid_create包内需要的为data_object_id,table进行过move操作的时候,data_object_id会改变,与object_id会不同
3. 根据rowid获取堵塞的具体内容
SQL> select * from test where rowid='AAAVgMAAEAAAAEUAAO';
ID NAME
---------- --------------------
15 I_FILE1