eygle.com   eygle.com
eygle.com eygle
eygle.com  
 

« Log Block Size | Blog首页 | 至性至情-金岳霖泪眼迷离忆徽因[阅读] »

关于redo copy latch的说明

一个进程产生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


历史上的今天...
    >> 2011-02-11文章:
    >> 2009-02-11文章:
    >> 2008-02-11文章:
           遥远与安宁-2008新年记事

无觅

By eygle on 2005-02-11 10:48 | Comments (3) | Internal | 180 |

3 Comments

注意: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???


CopyRight © 2004~2020 云和恩墨,成就未来!, All rights reserved.
数据恢复·紧急救援·性能优化 云和恩墨 24x7 热线电话:400-600-8755 业务咨询:010-59007017-7040 or 7037 业务合作: marketing@enmotech.com