oracle查询锁参考

本文介绍了如何在Oracle数据库中查询锁定信息、SQL文本、未提交SQL以及被DDL锁住的包。提供了用于杀死会话的命令,并讨论了IMMEDIATE选项在强制结束会话时的作用。此外,还展示了如何查找未提交的SQL事务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

–获取锁的基本信息

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; 

–获取sql文本

select l.session_id sid,
       s.serial#,
       l.locked_mode,
       l.oracle_username,
       s.user#,
       l.os_user_name,
       s.machine,
       s.terminal,
       a.sql_text,
       a.action
from v$sqlarea a,
     v$session s,
     v$locked_object l
where l.session_id = s.sid
  and s.prev_sql_addr = a.address
order by sid, s.serial#;



select distinct aa.SQL_TEXT,
                t2.OSUSER,
                t2.username,
                t2.sid,
              'alter system kill session '''|| t2.sid||','||t2.serial#||''''||';' ,                t2.logon_time,
                aa.FIRST_LOAD_TIME 操作时间,
                t2.SQL_ID,
                t2.PROCESS,
                t2.MACHINE,
                aa.MODULE,
                aa.ACTION,
                ab.EVENT 事件
  from v$locked_object t1, v$session t2, v$sql aa,v$session_wait ab
 where t1.session_id = t2.sid
   and t2.SQL_ID = aa.SQL_ID
   and t2.SID=ab.SID
 order by t2.logon_time;

当session是active的时候,alter system kill session 只是将session标识为killed
或者pseudo状态,并不会释放session持有的资源,所以我们在执行完alter system kill session 后,看会话还
是一直存在。
这种情况下可以使用 immediate选项,强制立即Kill会话,如下:
alter system kill session '3964,51752' immediate;

–获取未提交sql, 没有提交的sql不一定查询的到,有可能从共享池里面被移除了

select s.sid
     , s.serial#
     , s.username
     , s.osuser
     , s.program
     , s.event
     , to_char(s.logon_time, 'yyyy-mm-dd hh24:mi:ss')
     , to_char(t.start_date, 'yyyy-mm-dd hh24:mi:ss')
     , s.last_call_et
     , s.blocking_session
     , s.status
     , (
    select q.sql_text
    from v$sql q
    where q.last_active_time = t.start_date
      and rownum <= 1) as sql_text
from v$session s,
     v$transaction t
where s.saddr = t.ses_addr;

–查询package被哪些session锁住, ddl锁

select distinct aa.session_id sid,
                'alter system kill session ''' || aa.session_id || ',' ||
                vv.serial# || '''' || ';',
                aa.session_id sid,
                owner,
                name,
                aa.type,
                mode_held held,
                mode_requested request
  from dba_ddl_locks aa, v$session vv
 where aa.name = 'xxx_PUB_INSERT'
   and aa.session_id = vv.SID;
   

有不对的地方,还请指正,谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值