五、redo write size

lgwr写的数量取决于可以写入的重做值日的大小。在oltp环境中如果经常的commit会很小,如果批量处理会很大。
oracle8i以后,lgwr写入的时候尽量避免redo copy 不完全的情况(需要取得redo copy latch)。针对lgwr写入的情况中情况,lgwr写完redo thread,或者写到最后一个bolck,这个块可能被thread持有redo copy latch ,但已经没有redo record.针对lgwr的后两种情况,commit或者dbwn,如果redo copy latch 被占用的话,lgwr进入lgwr wait for redo copy 事件进行等待。lgwr不会尝试取得latch,因此不会进入latch free事件当中。之后lgwr写至需要同步的最高的redo block,有可能追加一些为了对并发的redo log 保持redo copy latch的信息。
lgwr没有用最大的i/o来限制写入的尺寸。它一次性写入所有的redo,如果必要,也允许操作系统用multiple physical writes 方式写。
写入的log blocks总数用redo blocks written 的系统统计信息累计。写的次数用redo writes 的系统统计信息积累。这两个参数可以用来平均写的大小。

六、Redo Write Multiplexing

如果oracle日志组有多个成员,lgwr必须写每个active的成员。如果non-blocking writes可用的话(也就是操作系统异步i/o可用并且disk异步支持启用),那么lgwr将并行写这些成员。
然而,如果non-blocking不可用,lgwr必须顺序地写每个成员,这样会成倍地增加日志写的时间。即便lgwr i/o slaves通过_lgwr_io_slaves直接或间接地配置,lgwr也不会并行写日志。连续的日志写可以通过不同的i/o slaves并行写入,但是每个日志写被一个i/o slave顺序写入。这时候等待事件当中的log file parallel write可能会误导。
如果non-blocking可用,那么这个等待的时间也会误导我们。它记录的不是我们期望的完全的日志写时间,而是第一个和最后一个写完的差值。(Instead, it measures the delta between the elapsed times of the first and last component parallel writes to finish.

七、change vectors

数据库的一个逻辑的变化至少包含两个以上的物理块的变化。例如,在表中插入一行在改变自己所在表的块的同时,可能引起好几个index block的变化。对大多数的块的改变,肯定会引起一个rollback segment块的变化。也可能会引起rollback segment header block ,block cleanouts,freelist 的变化等等。
在对数据库作更改之前,进程必须获得对所修改的数据所在的bufferbuffer locks,并且为即将的变化准备好一套change vectors,每个改变都需要相应的一套。这些change vectors必须放入redo stream作为一个单独的entry或者叫做redo record,相应的变化才能写入到database block

八、redo latching

产生redo的进程首先要获得redo copy latch,这个latch可以让他们将自己的日志放进log buffer当中。lgwr在写target log bufferdisk之前,应该等待直到这个copy过程结束。进程采用no-wait模式获取相应的redo copy latch,因为进程可以用任意一个redo copy latch完成copy过程。进程首先获取它最后持有的latch ,如果失败,将依次获取其它的latch,只有在尝试所有的latch失败之后,对最后一个latch使用willing-to-wait模式等待。
一旦获取了redo copy latch ,还必须得到redo allocation latch去分配log buffer.redo allocation latch 保护sag用来追踪log buffer使用情况的变量bi。分配的空间的大小依据chang vectors,然后加上每块16字节的block header。空间一旦分配,redo allocation latch 就会被释放。change vectors会从进程的pga当中copylog buffer
8i开始,当change vectors反映的变化对数据库实施之后,redo copy latch将被进程持有。因此在redo copy latch被释放掉之前,redo entry要么valid 要么invalid。通过这个方式,redo records的有效性在lgwr写之前得到保证。所以即便是oracle bug产生redo,在写log file之前也会在redo streams中标示成invalid。这样在做数据库恢复的时候,可以跳过invalidentry
这时候,进程可能需要通知lgwrlog buffer了。为了确保没有必要的post,进程还必须获得redo writing latch 去检查lgwr是否active或者检查是否已经posted。如果lgwr post ,redo writing latch被释放掉。
进程从 log file sync 中苏醒的时候,需要 redo allocation latch ,然后查看 log buffer 是否他所关心的日志写入 disk ,如果没有,进程将等待。 sga 的变量 b i 用来标示是否进入到 disk 。同时, dbwn 也需要 redo allocation latch 去查看它关心高 rba 是否被同步。