February 11, 2005
关于redo copy latch的说明
作者:eygle
出处:http://blog.eygle.com
一个进程产生redo时首先需要获得redo copy latch,获得了该latch以后才能把redo拷贝到Log Buffer中。redo copy latch表明进程正在把redo拷贝入log buffer中,在此过程中,LGWR应该等待直到进程拷贝完成才能把目标Log buffer Block写入磁盘。
初始化参数_LOG_SIMULTANEOUS_COPIES,定义允许同时写redo的redo copy latch的数量。
在Oracle7和Oracle8里,_LOG_SIMULTANEOUS_COPIES缺省的等于CPU的数量。
从Oracle8.1.3开始,缺省的_LOG_SIMULTANEOUS_COPIES变成2倍的CPU数量,并且成为了一个隐含参数:
SQL> @d:\script\gethiddenpar Enter value for par: log_simul old 14: x.ksppinm like '%_&par%' new 14: x.ksppinm like '%_log_simul%' NAME VALUE ISDEFAULT ISMOD ISADJ ------------------------------ ------------------------- --------- ---------- ----- _log_simultaneous_copies 2 TRUE FALSE FALSE |
获得隐含参数的脚本,请参考如何获得Oracle的隐含参数
SQL> col name for a20 SQL> select addr,latch#,child#,name,gets,immediate_gets,immediate_misses 2 from v$latch_children where name = 'redo copy'; ADDR LATCH# CHILD# NAME GETS IMMEDIATE_GETS IMMEDIATE_MISSES -------- ---------- ---------- -------------------- ---------- -------------- ---------------- 6C19A1B4 136 1 redo copy 6 107939 181 6C19A29C 136 2 redo copy 7 3 0 |
注意:LGWR进程必须获得所有的redo copy latch,然后才能将Log Buffer写入Log File.
redo copy latch获取以后,紧接着需要获取redo allocation latch ,分配redo空间,空间分配完成以后,redo allocation latch 即被释放,进程把PGA里临时存放的redo信息COPY入redo log buffer,COPY完成以后,redo copy latch 释放。
在完成redo copy以后,Process可能需要通知LGWR去执行写出(如果redo copy是commit等因素触发的)。
为了避免LGWR被不必要的post,进程需要先获取redo writing latch去检查LGWR是否已经激活或者已经被Post。如果LGWR已经激活或被Post,redo writing latch将被释放。
SQL> col name for a20 SQL> select addr,latch#,name,gets,misses,immediate_gets,immediate_misses 2 from v$latch where name='redo writing'; ADDR LATCH# NAME GETS MISSES IMMEDIATE_GETS IMMEDIATE_MISSES -------- ---------- -------------------- ---------- ---------- -------------- ---------------- 0217ECC8 113 redo writing 2265 0 0 0 |
如果redo writing latch竞争过多,可能意味着你的提交过于频繁.
通过系统统计信息或statspack可以获得这些信息,具体参考:Statspack之十四-"log file sync" 等待事件
在执行redo copy的过程中,进程以log file sync事件处于等待。
当进程从log file sync中等待中醒来以后,进程需要重新获得redo allocation latch检查是否相应的redo已经被写入redo log file,如果尚未写入,进程必须继续等待。
参考:
http://www.ixora.com.au/notes/redo_latching.htm
Posted by eygle at 10:48 AM | Comments (3)
