ORACLE SOS

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5722|回复: 2

如何查询导致oracle阻塞的具体sql语句

[复制链接]

1

主题

2

帖子

16

积分

新手上路

Rank: 1

积分
16
发表于 2015-11-19 05:42:21 | 显示全部楼层 |阅读模式
程总,请教个问题:
oracle遇到 tx锁的情况,要查询出具体是那条sql导致的锁,从而阻塞了其他sql语句的正常执行。

例如: 下面这中方式,只能查询到时 157 sid执行的sql导致了阻塞,但是查询不到是那条sql由于未提交导致的tx锁,从而阻塞了其他sql的正常执行,现在想查询出具体的sql,请问有什么方法?谢谢。
session1;
create table t_all_objs as select owner,object_id,object_name from all_objects where 0=1;
alter table T_ALL_OBJS  add constraint pk_t_all_objs primary key (OBJECT_ID);
insert into t_all_objs(owner,object_id,object_name) values('TEST',2013011701,'test1');
insert into t_all_objs(owner,object_id,object_name) values('TEST',2013011702,'test2');
commit;

update t_all_objs set object_name='test11' where object_id=2013011701;

select sid from v$mystat where rownum=1;--157


session 2

SQL> select sid from v$mystat where rownum=1;

       SID
----------
       273

SQL> update stz.t_all_objs set object_name='test101' where object_id=2013011701;

会一直等待.

session 3

SQL>  select sid from v$mystat where rownum=1;

       SID
----------
       419

SQL>  update stz.t_all_objs set object_name='test101419' where object_id=2013011701;
也会一直等待。

session4;

SELECT    'blocker('
       || wb.holding_session
       || ':'
       || sb.username
       || ')-sql:'
       || qb.sql_text
          blockers,
          'waiter ('
       || wb.waiting_session
       || ':'
       || sw.username
       || ')-sql:'
       || qw.sql_text
          waiters
  FROM dba_waiters wb,
       v$session sb,
       v$session sw,
       v$sqlarea qb,
       v$sqlarea qw
WHERE     wb.holding_session = sb.sid
       AND wb.waiting_session = sw.sid
       AND sb.prev_sql_addr = qb.address
       AND sw.sql_address = qw.address
       AND wb.mode_held <> 'None';

blocker(157:stz)-sql:select sid from v$mystat where rownum=1    waiter (419:SYS)-sql: update stz.t_all_objs set object_name='test101419' where object_id=2013011701
blocker(157:stz)-sql:select sid from v$mystat where rownum=1    waiter (273:SYS)-sql:update stz.t_all_objs set object_name='test101' where object_id=2013011701

现在只能查询到 sid 为157的session的sql 为:执行完update之后 执行的sql语句select sid from v$mystat where rownum=1。可以通过什么方式查询到 sid为157 执行的 未提叫的sql语句(update t_all_objs set object_name='test11' where object_id=2013011701)呢?谢谢。

回复

使用道具 举报

95

主题

266

帖子

1719

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1719
发表于 2015-11-20 23:51:44 | 显示全部楼层
你这样的情况,可以找出来阻塞的sid,然后通过v$open_cursor去找这个session里面语句,如果运气好可以找到,如果这个里面也没有了,那从现场来说,不容易找出来

Q Q:107644445
Tel:13429648788
Email:dba@xifenfei.com
个人Blog(惜分飞)
提供专业ORACLE技术支持(数据恢复,安装实施,升级迁移,备份容灾,故障诊断,系统优化等)
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|ORACLE SOS 技术论坛

GMT+8, 2024-12-5 10:10 , Processed in 0.061274 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表