六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 47|回复: 0

找到锁表的人

[复制链接]

升级  50%

5

主题

5

主题

5

主题

童生

Rank: 1

积分
25
 楼主| 发表于 2013-1-15 02:43:41 | 显示全部楼层 |阅读模式
在公司解决 Oracle 锁表问题时查到的资料:

select a.object_name,        l.session_id,        l.oracle_username,        l.os_user_name,        s.machine,        s.sid,        s.sql_address,        s.sql_hash_value,        s.sql_id,        s.sql_child_number   from v$session s, v$locked_object l, all_objects a  where l.process = s.process    and a.object_id = l.object_id

这段可以查到所有被锁的 session 和表,包括导致锁表的第一次 sql 操作的 session。最重要的,它可以找出是谁锁的,你可直接找他 PK 或者杀掉他的 session。

select c.object_name,        l.session_id,        l.oracle_username,        s.machine,        l.os_user_name,        s.sid,        s.program,        st.sql_text   from v$session               s,        v$locked_object         l,        all_objects             c,        v$sqltext_with_newlines st  where s.process = l.process    and c.object_id = l.object_id    and st.address = s.sql_address   order by s.sid, st.piece

如果有一条或多条 SQL 被阻塞住了,你可以通过这段 SQL 找出被阻塞的 SQL 是什么,从而定位出是哪位记录被锁住了。

select s.username user_name,       o.owner || '.' || o.object_name object_name,       s.sid || ',' || s.serial# sid_serial#,       s.program,       sq.sql_text  from dba_objects o, v$session s, v$lock v, v$sqltext_with_newlines sq where v.id1 = o.object_id   and v.sid = s.sid   and (v.type = 'tm' or v.type = 'hw')   and s.sql_address = sq.address order by program, object_name, s.sid, sq.piece;

这段与上面那段作用一样,不过显示的信息多少有点差别,由我们公司一们大牛提供。
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

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