根据row_wait_block定位阻塞记录内容(以tx锁为例)

本文介绍了如何通过event事件在v$session中获取row_wait_object#, row_wait_file#, row_wait_block#, row_wait_row#来定位数据库阻塞问题。首先,查看等待对象的详细信息;其次,利用dbms_rowid.rowid_create创建rowid号;最后,依据rowid揭示具体的阻塞内容。特别提示,dbms_rowid.rowid_create需要data_object_id,move操作后可能与object_id不同。" 85005668,7962838,使用Vue+Koa2实现JWT登录验证,"['前端开发', '后端开发', '数据库', '框架']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值