« Log Block Size | Blog首页 | 至性至情-金岳霖泪眼迷离忆徽因[阅读] »
关于redo copy latch的说明
作者:eygle | 【转载请注出处】|【云和恩墨 领先的zData数据库一体机 | zCloud PaaS云管平台 | SQM SQL审核平台 | ZDBM 数据库备份一体机】
链接:https://www.eygle.com/archives/2005/02/oeouredo_copy_l.html
一个进程产生redo时首先需要获得redo copy latch,获得了该latch以后才能把redo拷贝到Log Buffer中。链接:https://www.eygle.com/archives/2005/02/oeouredo_copy_l.html
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
历史上的今天...
>> 2011-02-11文章:
>> 2009-02-11文章:
>> 2008-02-11文章:
By eygle on 2005-02-11 10:48 | Comments (3) | Internal | 180 |
注意: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 释放。
这里是不是写的的有问题呀?应该是进程先server进程获得redo allocation latch后在redo log buffer中分配空间,之后在进程将redo写入log buffer之前获取copy latch,而这些都与lgwr进程无关的。
在lgwr将log buffer中的redo写入log file之前获取的是redo write latch
LGWR在写出之前,需要访问Latch Recovery Area检查redo copy latch,以确认目标redo并未处于写入状态。
此过程LGWR需要检查redo copy latch,不需要持有。
是我的表述不够清楚。
你好,你写的跟我看到的别的文章完全不一样啊,到底哪个对呢?
http://www.stariversoft.com/jszt/oracle/oracle_REDO8.html
这上面写的
REDO allocation( 分配 ) latch :在 REDO 日志缓冲内,分配空间给要存入的 REDO entry 时所需的 latch 。
REDO copy latch :当 REDO entry 太大,无法以 REDO allocation latch 执行 copy 时, REDO copy latch 会代替 REDO allocation latch 执行 copy 。
如果entry小的话,根本不需要获得REDO copy latch???