|
|
在公司解决 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;
这段与上面那段作用一样,不过显示的信息多少有点差别,由我们公司一们大牛提供。 |
|