请问如何查询Oracle数据库中的死锁总数在哪个视图或者表中可以看到

请问如何查询Oracle数据库中的死锁总数在哪个视图或者表中可以看到,第1张

你说的不是死锁,死锁的话oracle会自己处理,杀掉会话。你说的应该只是普通的锁,造成了阻塞,执行一个脚本$ORACLE_HOME/rdbms/admin/utllocktsql,可以把锁结构列出来。

这时候需要找出造成异常阻塞的session并清除。oracle session通常具有三个特征:(1)一个session可能阻塞多个session;(2)一个session最多被一个session阻塞;(3)session阻塞关系不会形成环路。(环路即死锁,oracle能自动解除)因此session的阻塞关系为一棵树,进而DB系统所有session的BLOCK阻塞关系是一个由若干session阻塞关系树构成的森林,而异常session一定会在故障爆发时成为根(root)。因此,找寻异常锁表session的过程就是找出异常的root。一般认为异常root有两个特征:(1)block树的规模过大,阻塞树规模即被root层层阻塞的session总数;(2)阻塞的平均等待时间过长。查找异常session的方法一:OEM—> performance—> Blocking Sessions查找异常session的方法二:select rroot_sid, sserial#,rblocked_num, ravg_wait_seconds,susername,sstatus,sevent,sMACHINE,sPROGRAM,ssql_id,sprev_sql_idfrom (select root_sid, avg(seconds_in_wait) as avg_wait_seconds,count() - 1 as blocked_numfrom (select CONNECT_BY_ROOT sid as root_sid, seconds_in_waitfrom v$sessionstart with blocking_session is nullconnect by prior sid = blocking_session)group by root_sidhaving count() > 1) r,v$session swhere rroot_sid = ssidorder by rblocked_num desc, ravg_wait_seconds desc;该SQL语句即是根据v$session的字段blocking_session统计阻塞树根阻塞session的计数以及平均阻塞时间、并进行排序,排名最前的往往是异常session。

楼主您好

所谓的锁等待:就是一个事务a对一个数据表进行ddl或是dml *** 作时,系统就会对该表加上表级的排它锁,此时其他的事务对该表进行 *** 作的时候会等待a提交或是回滚后,才可以继续b的 *** 作

所谓的死锁:当两个或多个用户相互等待锁定的数据时就会发生死锁,这时这些用户被卡在不能继续处理业务,oracle可以自动检测死锁并解决他们,通过回滚一个死锁中的语句,释放锁定的数据,回滚的话会遇到ora-00060

deadlock detected while waiting for resource

模拟锁等待:

两个事务a和b,分别创建t1,t2,并且初始化一条数据,

a 更改t1的数据,此时并不提交,这时候b更改相同的一列,此时b一直处于等待的状态

我们可以查询锁等待的内容:

wait_locksql

select

(select username from v$session where sid = asid) username,

asid,

(select serial# from v$session where sid = asid) serial#,

atype,

aid1,

aid2,

almode,

arequest,

ablock,

bsid blocking_sid

from v$lock a,

( select from v$lock

where request > 0

and type > 'MR'

) b

where aid1 = bid1(+)

and aid2 = bid2(+)

and almode > 0

and atype > 'MR'

order by username,asid,serial#,atype

此时可以查询到锁等待的现象,最后一列不为空的就是等待的事件

此时我们可以跟a用户提示让其提交事务或是回滚,也可以直接杀死

alter system kill session 'sid,serial#';

保持现状不动,在a事务更改t2表此时在a事务会产生

SQL> update t1 set id=1000 where id=1;

update t1 set id=1000 where id=1

第 1 行出现错误:

ORA-00060: 等待资源时检测到死锁

此时oracle已经帮我解决了这个死锁问题

死锁的产生需要四个必须的条件:

1 ,mutual execution(互斥)资源不能被共享,只能由一个进程使用

2,hold and wait(请求并持续)已经得到资源的进程可以再次申请新的资源

3,no pre-emption(不可剥夺)已经分配的资源不能被相应的进程强制剥夺

4,circular wait(循环等待条件)系统中若干进程组成环路,该环路中的每个进程都在等待相邻进程正占用的资源

定位死锁:

系统级别的定位

Select username,lockwait,status,machine,program from v$session where sid in (select session_id from v$locked_object)

Username死锁的用户,lockwait死锁的状态,status中active表示死锁,machine死锁所在的机器,program死锁来自于那个程序

语句级别的定位

Select sql_text from v$sql where hash_value in (select

sql_hash_value from v$session where sid in (select session_id from

v$locked_object));

进程级别的定位

Select susername,lobject_id,lsession_id,sserial#,loracle_usrename,los_user_name,lprocess from v$locked_object l,v$session s where lsession_id=ssid;

处理死锁的一般策略

1,鸵鸟算法忽略该问题

2,定位死锁并且恢复

3,仔细对资源进行动态分配,避免死锁

4,破坏死锁中的一个条件

如果oracle解决不了的死锁,我们需要定位到进程级别,找到对应的sid和serial#

alter system kill 'sid,serail#'

失败的话,找到对应的进程强制关闭

Select pspid from v$session s, v$process p where ssid=xx and spaddr=paddr

ps -ef | grep spid

kill -9 xx

查询oracle的死锁

locksql

SELECT bsusername "Blocking User", bsusername "DB User",

wsusername "Waiting User", bsSID "SID", wsSID "WSID",

bsserial# "Serial#", bssql_address "address",

bssql_hash_value "Sql hash", bsprogram "Blocking App",

wsprogram "Waiting App", bsmachine "Blocking Machine",

wsmachine "Waiting Machine", bsosuser "Blocking OS User",

wsosuser "Waiting OS User", bsserial# "Serial#",

wsserial# "WSerial#",

DECODE (wkTYPE,

'MR', 'Media Recovery',

'RT', 'Redo Thread',

'UN', 'USER Name',

'TX', 'Transaction',

'TM', 'DML',

'UL', 'PL/SQL USER LOCK',

'DX', 'Distributed Xaction',

'CF', 'Control FILE',

'IS', 'Instance State',

'FS', 'FILE SET',

'IR', 'Instance Recovery',

'ST', 'Disk SPACE Transaction',

'TS', 'Temp Segment',

'IV', 'Library Cache Invalidation',

'LS', 'LOG START OR Switch',

'RW', 'ROW Wait',

'SQ', 'Sequence Number',

'TE', 'Extend TABLE',

'TT', 'Temp TABLE',

wkTYPE

) lock_type,

DECODE (hklmode,

0, 'None',

1, 'NULL',

2, 'ROW-S (SS)',

3, 'ROW-X (SX)',

4, 'SHARE',

5, 'S/ROW-X (SSX)',

6, 'EXCLUSIVE',

TO_CHAR (hklmode)

) mode_held,

DECODE (wkrequest,

0, 'None',

1, 'NULL',

2, 'ROW-S (SS)',

3, 'ROW-X (SX)',

4, 'SHARE',

5, 'S/ROW-X (SSX)',

6, 'EXCLUSIVE',

TO_CHAR (wkrequest)

) mode_requested,

TO_CHAR (hkid1) lock_id1, TO_CHAR (hkid2) lock_id2,

DECODE

(hkBLOCK,

0, 'NOT Blocking', /// Not blocking any other processes /

1, 'Blocking', /// This lock blocks other processes /

2, 'Global', /// This lock is global, so we can't tell /

TO_CHAR (hkBLOCK)

) blocking_others

FROM v$lock hk, v$session bs, v$lock wk, v$session ws

WHERE hkBLOCK = 1

AND hklmode != 0

AND hklmode != 1

AND wkrequest != 0

AND wkTYPE(+) = hkTYPE

AND wkid1(+) = hkid1

AND wkid2(+) = hkid2

AND hkSID = bsSID(+)

AND wkSID = wsSID(+)

AND (bsusername IS NOT NULL)

AND (bsusername > 'SYSTEM')

AND (bsusername > 'SYS')

ORDER BY 1;

这些语句的执行最好是在plsql或是sqldeveloper如果是直接在数据库里面执行的需要格式化表,否则会很让你眼花的。

一般情况只发生锁超时,就是一个进程需要访问数据库表或者字段的时候,另外一个程序正在执行带锁的访问(比如修改数据),那么这个进程就会等待,当等了很久锁还没有解除的话就会锁超时,报告一个系统错误,拒绝执行相应的SQL *** 作。发生死锁的情况比较少,比如一个进程需要访问两个资源(数据库表或者字段),当获取一个资源的时候进程就对它执行锁定,然后等待下一个资源空闲,这时候如果另外一个进程也需要两个资源,而已经获得并锁定了第二个资源,那么就会死锁,因为当前进程锁定第一个资源等待第二个资源,而另外一个进程锁定了第二个资源等待第一个资源,两个进程都永远得不到满足。

erp100com

以上就是关于请问如何查询Oracle数据库中的死锁总数在哪个视图或者表中可以看到全部的内容,包括:请问如何查询Oracle数据库中的死锁总数在哪个视图或者表中可以看到、如何查看oracle数据库中哪些session异常阻塞了系统、oracle 死锁和锁等待的区别,锁等待等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/10152150.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存