免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2507 | 回复: 1
打印 上一主题 下一主题

查找 Oracle 用户锁的DLL SQL [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-09-17 14:37 |只看该作者 |倒序浏览
查找 Oracle 用户锁的DLL SQL,这是Oracle DBA的常使用到的,也是我每天必用的脚本之一;运行此脚本之前请用SYS用户登录:

     create or replace procedure SYS.EEDBA_RPT_BLOCKING_SID IS
cursor C1 is
   select s.username Usrname,
   s.osuser osuser,
   s.sid,
   s.type lock_type,
   decode(lr.lmode,0,'None', 2,'SS',3,'SX',4,'S',5,'SSX',6,'EX') Mode_Held,
   lr.type,
   s.process UnixID,
   s.machine machine,
   s.terminal,
   s.status,
   a.owner||'.'||a.object_name object_hold,
   lr.block,
   s.program,
   s.logon_time
from all_objects a, v$locked_object o, v$session s, v$lock lr
where (id1,id2) in (
        select id1,id2
        from v$lock le
        where le.request >; 0 )
  and s.sid = lr.sid
  and s.sid = o.session_id
  and a.object_id (+)= o.object_id
order by lr.id1, lr.id2, lr.block desc ;
  counter number := 0 ;
begin
  dbms_output.new_line;
  dbms_output.put_line('Username   OSUser   SID   Mode   Type   UNIX ID '||  
' Machine  Terminal   Active   Object   Logon   Application');
  dbms_output.put_line('========   ======   ===   ====   ====   ======= '||  
' =======  ========   ======   ======   =====   ===========');
  for r1 in C1 loop
      if r1.block >; 0 and counter >; 0 then
         dbms_output.put_line('.');
         dbms_output.put_line('.');
      end if;
      if r1.block = 0 then
         dbms_output.put('+    ');
      end if;
      dbms_output.put(r1.Usrname);
      dbms_output.put('   ');
      dbms_output.put(r1.osuser);
      dbms_output.put('   ');
      dbms_output.put(r1.sid);
      dbms_output.put('   ');
      dbms_output.put(r1.Mode_Held);
      dbms_output.put('   ');
      dbms_output.put(r1.type);
      dbms_output.put('   ');
      dbms_output.put(r1.UnixID);
      dbms_output.put('   ');
      dbms_output.put(r1.machine);
      dbms_output.put('   ');
      dbms_output.put(r1.terminal);
      dbms_output.put('   ');
      dbms_output.put(r1.status);
      dbms_output.put('   ');
      dbms_output.put(r1.object_hold);
      dbms_output.put('   ');
      dbms_output.put(r1.logon_time);
      dbms_output.put('   ');
      dbms_output.put_line(r1.program);
      counter := counter + 1;
  end loop;
  if  counter = 0 then
       dbms_output.put_line('.');
       dbms_output.put_line('NO Blocking found');
  end if;
  dbms_output.put_line('.');
  dbms_output.put_line('.');
  dbms_output.put_line('End of report');
end EEDBA_RPT_BLOCKING_SID ;
/
grant execute on SYS.EEDBA_RPT_BLOCKING_SID to system
/

论坛徽章:
0
2 [报告]
发表于 2003-09-17 19:26 |只看该作者

查找 Oracle 用户锁的DLL SQL

因为ORACLE的锁是由系统控制的,而不像以前用的Infomix是可以由管理员配置的,所以对锁的了解不多,在此请教一下各位兄台:

   有一表,因为对它操作的进程很多,工作一段时间后(时间不长)其它进程对它操作就发生了困难,典型的,我只能用select *from ...查看得到数据,但使用select count(*) from ...就不行了,我想这必定是出现了锁的问题,但我现在不能确定发生在表上的锁是什么级别,它对表有什么影响?

   还有,我看前面的贴子中有介绍:
ORACLE里锁有以下几种模式:

0:none
1:null 空
2:Row-S 行共享(RS):共享表锁,sub share
3:Row-X 行独占(RX):用于行的修改,sub exclusive
4:Share 共享锁(S):阻止其他DML操作,share
5:S/Row-X 共享行独占(SRX):阻止其他事务操作,share/sub exclusive
6:exclusive 独占(X):独立访问使用,exclusive

数字越大锁级别越高, 影响的操作越多。

    能不能更详细地说一说有关这几种模式?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP