新博客http://www.cnblogs.com/zhjh256 欢迎访问
分类: Oracle
2007-12-26 14:17:07
redo copy latch未命中率通常不是问题,并且通常并不需要调整,但是理解redo latches是如何使用的是有必要的。
redo latches如何使用?
redo latches主要用在重做产生上,但是也与log file sync有关联。
重做产生
一个逻辑原子数据库改变通常有两个以上物理块改变组成。并且对于大多数改变,必须有一个相应的改变至少到一个回滚段块。在改变数据库块前,进程必须在每个包含受影响的数据库块的当前模式影像的缓冲上得到一个缓冲锁,并且准备一个change vectors集代表想要的改变。在change vectors集应用到数据库块之前,他们必须以一个重做条目被拷贝到重做流中。
必须采用redo allocation latch在日志缓冲中分配空间。该latch保护用来跟踪日志缓冲块使用和释放的SGA变量。
分配的空间数量需要为组成那个逻辑数据库改变的全部change vectors,并且如果重做条目跨越一个/多个日志块,则还需要加上每个日志块头的16个字节的额外开销。
但是,在得到redo allocation latch前,进程必须先得到redo copy,因为必须使用其拷贝日志条目到日志缓冲。redo copy用来指示一个进程正在拷贝重做到日志缓冲,并且那个LGWR在写目标重做日志块到磁盘前需要等待拷贝完成。
大多数情况下使用非等待模式获得redo copy latch,因为进程可以使用它们中的任何一个保护其拷贝到日志缓冲中。其会首先尝试得到它最后保持的copy latch。如果失败,进程将会轮回得到其他的copy latch。如果使用非等待模式尝试获得其它copy latch都失败了,那么将会使用等待模式得到最后一个copy latch。
一旦得到了redo copy latch和redo allocation latch,将会在重做日志缓冲中分配空间,然后redo allocation latch 将会被释放并且change vectors将会从进程pga的临时缓冲拷贝到日志缓冲。
一旦拷贝完成,change vectors将会被应用到受影响的数据库块,重做条目被标记为有效,然后进程释放redo copy latch。如果分配的空间使用超过了_log_io_size参数的设置,或者重做流中包含了提交标记符,此时进程可能需要唤醒lgwr并通知刷新日志缓冲。为了确保lgwr不会不必要的被唤醒,进程将采用redo writing latch检查lgwr是否active或者已经被唤醒。然后释放redo writing latch。
LGWR使用redo latches的机制
获得redo latches不仅仅与重做产生和log file sync有关,同时它们也被lgwr用来写重做到日志文件上。当lgwr被唤醒的时候,其首先得到redo writing latch更新sga变量指示其active状态,以避免其他进程不必要的唤醒lgwr。如果没有被唤醒,lgwr将获得redo allocation latch确定是否有重做可写。如果没有,在启动rdbms ipc message前,将重新得到redo writing latch指示其不再active。
如果有任何重做可写,lgwr将会为redo copy latches预计latch恢复区域以确定重做缓冲中是否有任何不完整的拷贝需要写。如果有,lgwr将在LGWR wait for redo copy上沉睡,并且在需要的copy latches被释放后被唤醒。
LGWR用来得到redo writing latch,redo allocation latch和redo copy latches花费的时间的和累计在redo writer latching time统计中。
在每次写完成后,LGWR必须再次得到redo allocation latch更新饱含日志缓冲基磁盘块的sga变量。使用这种机制高效的释放日志缓冲块,并可以重用。
redo latches的调整
通常仅在redo allocation latch上的等待模式未命中率很高或者redo copy latch上的非等待模式很高时,才考虑调整redo latch。
Redo Allocation
在每个实例中只有一个redo allocation,并且不能并行使用。通常也没有办法减少latch保持的延迟。DBA能做的通常只是减少LATCH上的负载。最重要的是确保LGWR不能过分活跃,并且DBWn不能过渡频率的检查点最近的改变。
在应用程序级别,主要频繁的commit,避免SELECT FOR UPDATE和before行触发器,以及最小化redo的产生。
Redo Copy
在Oracle 8.1下,LGWR自身是不会在redo copy latch上沉睡的,在这些latch上的沉睡指示并行性的程度超过了latch支持的并行度。在这种情况下, redo copy latch可以使用 _log_simultaneous_copies参数增加,但是不能超过32的限制。
总的来说,除非产生的重做最小化了并且redo allocation已经调整过了,否则不应该调整redo copy latch。同时也应该检查latch持有者的CPU短缺问题。