oracle 查锁

2011-01-14

 


--查锁的SQL
select p.spid, s.serial#, s.sid, t.SQL_TEXT
  from v$process p, v$session s, v$sqltext t, dba_objects o, v$locked_object l
 where s.paddr = p.addr
   and s.sql_address = t.ADDRESS
   and s.status='ACTIVE'
   and s.username='LXGS'
   and o.object_id = l.object_id
   and s.sid = l.session_id
 order by spid,t.PIECE
;

--取  杀锁进程  语句   需将结果拷贝出来在command window执行
select 'alter system kill session ''' || s.sid || ',' || s.serial# || ''';' kill_session,
   decode(l.LOCKED_MODE,0,'none',1,'null',2,'行共享',3,'行独占',4,'共享锁',5,'共享行独占',6,'独占(X)') lock_mode,
   p.SPID,s.MACHINE,s.program,s.username ,'kill -9 '||p.spid kill_spid
  from v$session s, dba_objects o, v$locked_object l, v$process p
 where o.object_id = l.object_id
   and s.sid = l.session_id
   and s.paddr = p.addr
 --  and s.username = 'LXGS'
;  


1>.unix/linux下运行top 3查到最高占用cpu的sid
   select addr from v$process where spid='最高占用cpu的sid';

2>.根据地址查到会话相关信息
select s.sid,s.SQL_ADDRESS,s.USERNAME,s.STATUS,s.PROGRAM,s.OSUSER,s.MACHINE from v$session s where s.PADDR='$addr';

3>根据会话中的ID和sql地址查找相关锁和SQL
  <1>查到出问题的对象
  select object_id from v$locked_object where session_id="v$session.sid";
  select * from dba_objects  where object_id="v$locked_object.object";
  <2>查找相关SQL
  select * from v$sqltext  tt where tt.ADDRESS="v$session.SQL_ADDRESS"

如果以上部份没有记录使用以下SQL查找数据库当前执行SQL
select a.SID, b.SQL_TEXT, a.MACHINE
  from v$session a
  join v$sql b on a.SQL_ADDRESS = b.ADDRESS
 where a.STATUS = 'ACTIVE' and nvl(a.MACHINE, ' ') <> ' ';

Oracle 中,有多种方法可以查询锁表信息: - **查询锁表语句**: ```sql select t2.username,t2.sid,t2.serial#,t2.logon_time from v$locked_object t1,v$session t2 where t1.session_id=t2.sid order by t2.logon_time; ``` 该查询能够展示出锁表的用户、会话 ID、序列号以及登录时间等信息[^1]。 - **查看对象被锁及会话信息**: ```sql SELECT object_name, machine, s.sid, s.serial# FROM gv$locked_object l, dba_objects o, gv$session s WHERE l.object_id = o.object_id AND l.session_id = s.sid; ``` 此查询可查看哪些对象被锁住以及相关的会话信息,还能从中获取需要解锁的会话的 SIDSERIAL# 值[^3]。 - **查看被锁表信息**: ```sql select sess.sid,sess.serial#, lo.oracle_username,lo.os_user_name, ao.object_name,lo.locked_mode from v$locked_object lo,dba_objects ao,v$session sess where ao.object_id=lo.object_id and lo.session_id=sess.sid; ``` 该查询能显示出被锁表的会话 ID、序列号、用户名、操作系统用户名、对象名和锁定模式等信息[^5]。 - **查看数据库引起锁表的 SQL 语句**: ```sql SELECT A.USERNAME, A.MACHINE, A.PROGRAM, A.SID, A.SERIAL#, A.STATUS, C.PIECE, C.SQL_TEXT FROM V$SESSION A, V$SQLTEXT C WHERE A.SID IN (SELECT DISTINCT T2.SID FROM V$LOCKED_OBJECT T1, V$SESSION T2 WHERE T1.SESSION_ID = T2.SID) AND A.SQL_ADDRESS = C.ADDRESS(+) ORDER BY C.PIECE; ``` 通过此查询可找出导致锁表的 SQL 语句以及相关会话的详细信息[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值