ITPub博客

首页 > 数据库 > Oracle > oracle等待事件之enq: CF – contention

oracle等待事件之enq: CF – contention

原创 Oracle 作者:水逸冰 时间:2019-09-03 22:17:57 0 删除 编辑

Enqueue 是一种保护共享资源的锁定机制,避免因并发操作而损坏数据,Enqueue 采用排队机制,即 FIFO(先进先出)来控制资源的使用。在任何需要读取控制文件的动作时,就会发生等待事件enq: CF – contention,CF locks被用来串行化controlfile事务,在读和写控制文件的时候使用该锁。通常该锁的分配时间非常短,比如在下面事件中会分配该锁,那么也就可能发生enq: CF – contention等待事件:

l   Checkpoint

l   Redo Logfile的切换

l   Redo lofileg的归档

l   执行实例恢复

l   操作redo logfile

l   热备开始和结束

l   Nologging 事物的DML操作

如果某个事物设置了nologging属性,那么如下动作更容易产生该等待事件:

direct load (SQL*Loader)

direct-load INSERT

CREATE TABLE ... AS SELECT

CREATE INDEX

ALTER TABLE ... MOVE PARTITION

ALTER TABLE ... SPLIT PARTITION

ALTER INDEX ... SPLIT PARTITION

ALTER INDEX ... REBUILD

ALTER INDEX ... REBUILD PARTITION

INSERT, UPDATE, and DELETE on LOBs in   NOCACHE NOLOGGING mode stored out of line

       查询该等待事件的holder

select l.sid, p.program, p.pid, p.spid,   s.username, s.terminal, s.module, s.action, s.event, s.wait_time,   s.seconds_in_wait, s.state

from v$lock l, v$session s, v$process p

where l.sid = s.sid

and s.paddr = p.addr

and l.type='CF'

and l.lmode >= 5;

       查询该等待事件的waiter

select l.sid, p.program, p.pid, p.spid,   s.username, s.terminal, s.module, s.action, s.event, s.wait_time,   s.seconds_in_wait, s.state

from v$lock l, v$session s, v$process p

where l.sid = s.sid

and s.paddr = p.addr

and l.type='CF'

and l.request >= 5;

       原因分析及解决办法:

如果holder是后台进程,比如lgwr,ckpt,arcn等,那么检查redo log大小,切换频次,检查fast_start_mttr_target的设置,检查归档路径是否可用。

如果是holder是前台进程,那么大都是由于nologging的事物上正在发生DML或者DDL,此时由于nologging属性,那么oracle需要向控制文件中记录unrecoverable SCN,典型的是伴随enq: CF – contention的通常还有control file parallel write,这个会话在写的过程中持有CF locks,其它会话如果也要更新控制文件的话,那么就要等待了。

 


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

请登录后发表评论 登录
全部评论
精通oracle和linux,热衷于研究oracle,擅长shell和Python编程,喜欢自动化运维。

注册时间:2017-08-05

  • 博文量
    91
  • 访问量
    77974