yangdong 发表于 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 awhere 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 stwhere 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_textfrom 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;

这段与上面那段作用一样,不过显示的信息多少有点差别,由我们公司一们大牛提供。
页: [1]
查看完整版本: 找到锁表的人