免费注册 查看新帖 |

Chinaunix

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

如何通过v$lock和v$locked和v$session 察看oracle锁情况 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-07-03 14:51 |只看该作者 |倒序浏览
如何通过v$lock和v$locked和v$session 察看oracle锁情况

在v$lock 哪个字段什么状态标志是锁呢,请大虾指教

论坛徽章:
0
2 [报告]
发表于 2006-07-03 17:03 |只看该作者

查找死锁进程


  1. column sid format 999;
  2. column b format 9;
  3. column object_name format a30;
  4. select v$lock.sid,
  5. decode(v$lock.type,
  6.         'MR', 'Media Recovery',
  7.         'RT','Redo Thread',
  8.         'UN','User Name',
  9.         'TX', 'Transaction',
  10.         'TM', 'DML',
  11.         'UL', 'PL/SQL User Lock',
  12.         'DX', 'Distributed Xaction',
  13.         'CF', 'Control File',
  14.         'IS', 'Instance State',
  15.         'FS', 'File Set',
  16.         'IR', 'Instance Recovery',
  17.         'ST', 'Disk Space Transaction',
  18.         'TS', 'Temp Segment',
  19.         'IV', 'Library Cache Invalida-tion',
  20.         'LS', 'Log Start or Switch',
  21.         'RW', 'Row Wait',
  22.         'SQ', 'Sequence Number',
  23.         'TE', 'Extend Table',
  24.         'TT', 'Temp Table',
  25.         'Unknown') LockType,
  26. rtrim(object_type) || ' ' || rtrim(owner) || '.' || object_name object_name,
  27. decode(lmode,   0, 'None',
  28.                 1, 'Null',
  29.                 2, 'Row-S',
  30.                 3, 'Row-X',
  31.                 4, 'Share',
  32.                 5, 'S/Row-X',
  33.                 6, 'Exclusive',        'Unknown') LockMode,
  34. decode(request, 0, 'None',
  35.                 1, 'Null',
  36.                 2, 'Row-S',
  37.                 3, 'Row-X',
  38.                 4, 'Share',
  39.                 5, 'S/Row-X',
  40.                 6, 'Exclusive', 'Unknown') RequestMode,
  41. ctime, block b
  42. from v$lock, all_objects
  43. where sid > 6
  44. and v$lock.id1 = all_objects.object_id;
复制代码

论坛徽章:
0
3 [报告]
发表于 2006-07-03 17:05 |只看该作者

这个SQL可用来生成杀死死锁进程的SQL


  1. select 'alter system kill session '''||a.sid||','||b.serial#||''';'
  2. from v$lock a,all_objects c,v$session b
  3. where a.sid > 6 and a.id1 = c.object_id and a.sid = b.sid;



  4. select 'alter system kill session '''||a.sid||','||b.serial#||''';'
  5.     from v$lock a,v$session b
  6.     where a.sid > 6 and a.sid = b.sid;
复制代码

[ 本帖最后由 xiao_cui2000 于 2006-7-4 09:46 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2006-07-03 17:20 |只看该作者
谢谢,

论坛徽章:
0
5 [报告]
发表于 2006-07-03 17:26 |只看该作者
还想问下,他们和dba_object 关联的时候是什么意思呢 ?

论坛徽章:
0
6 [报告]
发表于 2006-07-03 17:40 |只看该作者
得到被锁的表的object_name

论坛徽章:
0
7 [报告]
发表于 2006-07-03 18:22 |只看该作者
还是不太明白,是不是如果有锁出现会纪录在v$lock表里面,然后关联到dba_object表查出具体object_name?

论坛徽章:
0
8 [报告]
发表于 2006-07-04 09:40 |只看该作者
原帖由 fanzerca 于 2006-7-3 18:22 发表
还是不太明白,是不是如果有锁出现会纪录在v$lock表里面,然后关联到dba_object表查出具体object_name?

是这个意思.因为第一个SQL要显示出哪个表被锁.所以到all_objects中查找
第二个sql可以不用.我改一下

论坛徽章:
0
9 [报告]
发表于 2006-07-04 09:47 |只看该作者
奇怪,我把第二个sql的all_objects去掉后,sql执行半天也不出结果

论坛徽章:
0
10 [报告]
发表于 2006-08-31 19:35 |只看该作者
空闲之际,写了个sql语句,解决当前工作中经常遇到的锁定和被锁定表得信息,欢迎大家使用,指正。
如何快捷的显示当前锁定和被锁定表的用户,sql等信息
如果是dba用户那么可以使用
一、
阻塞和等待的用户及sql语句
select 'blocker('||wb.holding_session||':'||sb.username||')-sql:'||qb.sql_text blockers,sb.machine,sb.terminal,
       'waiter ('||wb.waiting_session||':'||sw.username||')-sql:'||qw.sql_text waiters ,sw.machine,sb.terminal
from  dba_waiters wb,
      v$session   sb,
      v$session   sw,
      v$sqlarea   qb,
      v$sqlarea   qw
where wb.holding_session=sb.sid
and   wb.waiting_session=sw.sid
and   sb.prev_sql_addr=qb.address
and   sw.sql_address=qw.address
and   wb.mode_held<>'None'

二、如果不是dba那么就不能使用dba_waiters表了,可以使用v$lock来替换

select 'blocker('||lb.sid||':'||sb.username||')-sql:'|| qb.sql_text  blockers,
       'waiter ('||lw.sid||':'||sw.username||')-sql:'|| qw.sql_text  waiters
      

from  v$lock lb,  
     v$lock lw,
     v$session sb,
     v$session sw,
     v$sql     qb,
     v$sql     qw
     
where lb.sid=sb.sid
and  lw.sid=sw.sid
and  sb.prev_sql_addr=qb.address
and  sw.sql_address=qw.address
and  lb.id1=lw.id1
and  sw.lockwait is not null
and  sb.lockwait is null
and  lb.block=1
如果向更详细的显示username的信息可以加入


select 'blocker('||lb.sid||':'||sb.username||')-sql:'|| qb.sql_text  blockers,sb.machine,sb.terminal,sb.logon_time,
       'waiter ('||lw.sid||':'||sw.username||')-sql:'|| qw.sql_text  waiters ,sw.machine,sw.terminal,sw.logon_time
      

from  v$lock lb,  
     v$lock lw,
     v$session sb,
     v$session sw,
     v$sql     qb,
     v$sql     qw
     
where lb.sid=sb.sid
and  lw.sid=sw.sid
and  sb.prev_sql_addr=qb.address
and  sw.sql_address=qw.address
and  lb.id1=lw.id1
and  sw.lockwait is not null
and  sb.lockwait is null
and  lb.block=1

三、--根据以上显示的信息可以知道当前产生锁和等待的用户信息
--那么就需要杀掉当前产生阻塞的用户,在执行杀掉用户进程前请咨询dba和该业务的同事,是否产生其他的不当影响

select sid,serial# from v$session sid in (...)  --查询产生阻塞用户的  sid,serial#,然后
alter system kill session(sid,serial#);   --杀掉产生阻塞的用户
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP