检查等待事件处理

Oracle数据库等待与锁解析
本文介绍了Oracle数据库中等待事件的查询方法,包括不同类型的等待事件及其相关联的等待类,以及如何解决缓冲区等待等问题。同时,文章还详细解释了如何找出持有阻塞锁的会话,并探讨了Oracle中的锁机制。

查询不同类型的等待,以及与每种类型相关的等待事件
select wait_class ,name from v$event_name where name LIKE 'enq%' and wait_class <>'Other' order by wait_class 

查看当前的等待有哪些类型:
select wait_class,sum(time_waited),sum(time_waited)/sum(total_waits) sum_waits from v$system_wait_class order by 3 desc;

如果看到有大量的空闲等待,不必担心,实际上,在任何正常运行的数据库中都会看到这一点,但是的关注用户i/o的应用类等待,关注这类出来v$system_wait_class以外,还可以使用v$system_event 和v$event_name视图。

select a.event,a.total_waits,a.time_waited,a.average_wait from v$system_event a,v$event_name b,v$system_wait_class c 
where a.event_id=b.event_id
and b.wait_class#=c.wait_class#
and c.wait_class in (' Application','Concurrency')
order by average_wait desc;



数据库文件离散读取和数据库文件顺序读取时oracle等待事件中常见的等待。
数据库文件离散读取时由于对大表的全表扫描导致的,如果遇到此类等待,可以考虑在表上添加索引。
数据库文件顺序读取是由于索引读取引起的,这是由于当有大量的索引进行读取时,就会造成查询效率低下哦

理解oracle的不同等待事件类型,增强了我们快速诊断oracle中与等待相关的问题的能力。

二 .解决缓冲区等待

oracle有几种类型的缓冲区,例如数据块,段头,撤销头和撤销块。如何来解决缓冲区忙的等待的情况,取决于引起问题的缓冲区类型。
可以利用以下两个查询,找出缓冲区等待的缓冲类型
1->
 select row_wait_obj# from v$session where event='buffer busy waits';

2->
select owner,object_name,subobject_name,object_type from dba_objects where data_object_id = &row_wait_obj;

首先通过第一个查询或渠道row_wait_pbj#的值,然后再第二个查询中将其用作为data_object_id的值。


处理总结下
1)数据段头
  如果上面的查询显示缓冲区等待是由于数据段头争夺引起的,那么就说明在数据中,由于多个进程尝试将数据插入到同一个数据块中而导致空闲列表争夺。这些进程中的每一个都需要先获取得一个空闲列表,然后才能向数据库中插入数据。如果数据库未使用assm,那么久应该从手动空间管理切换过去。若无法使用assm的情况下,则必须为相关的数据段增加空闲列表。
2)数据块
 数据块缓冲区争夺可能与某张表和某个索引有关,这类争夺通常是由于右手索引导致,右手索引就是使用顺序号生成键值等情况下,导致多个进程将数据插入到同一个索引引起。同样,如果使用的是手工段空间管理,切换到自动段空间管理或者增加段的空闲列表。
3)撤销头和撤销块
如果使用的是自动撤销管理,那么由于撤销头和撤销块数据争夺所引起的缓冲区等待将会很少,如果有可以增加撤销表空间的大小来解决这个问题


缓冲区忙等待表明多个进程同时访问同一个数据块,出现大量缓冲区等待的原因之一就是,效率较低的查询将过多的数据块读取到缓冲高速区中,从而使要读取到一个或多个数据块的其他会话不得不等待。不仅如此,将过多数据读取到缓冲区中查询,还可能会使原来需要保留的数据块被挤出缓存,这就必须引起缓冲区等待的数据段的查询,以减少读取到缓冲区的数据块数目。

三 如何找出谁持有阻塞锁
在分析oracle锁时,必须检查的一些关键数据库视图包括v$lock和v$session,v$locked_object和dba_objects视图,为了查清一个会话时否被另一个会话所持有的锁阻塞,可以按以下查询:
select s1.username ||'@|| s1.machine
|| ' (SID='||s1.sid ||') is blocking '
|| s2.username || '@'||s2.machine ||'(SID='||s2.sid||')' as blocking_status 
from v$lock l1,v$session s1,v$lock l2,v$session s2
where s1.sid=l1.sid and s2.sid=l2.sid
and l1.block=1 and l2.request >0
and l1.id1 = l2.id1
and l2.id2 = l2.id2;


oracle使用两种类型的锁来阻止破坏性行为:排他锁和共享锁。
在一行或一张表上只有一个事务能够得到拍他锁,而在同一个对象上可以有多个共享锁。

oracle在两个层级上使用锁-行锁和表锁。
行锁,标记为tx,只会锁定表上的一行将会被dml语句所修改的数据,对于select ......from update也一样。包含这些语句之一的事务会获取到一个排他行锁以及一个共享锁,当其他会话要对其操作时候,是无法实现的,只有这个事务提交或回滚啦。
在oracle中,锁定时按照下面的方式进行的:
1)读取不会阻塞另一个读取
2)读取不会阻塞一个写入
3)写入不会阻塞对相同数据的读取
4)写入会阻塞另一个需要修改相同数据的写入




来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30430420/viewspace-1786584/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/30430420/viewspace-1786584/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值