oracle internals5-8

五、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 的变化等等。
在对数据库作更改之前,进程必须获得对所修改的数据所在的 buffer buffer locks ,并且为即将的变化准备好一套 change vectors ,每个改变都需要相应的一套。这些 change vectors 必须放入 redo stream 作为一个单独的 entry 或者叫做 redo record ,相应的变化才能写入到 database block

八、redo latching

产生 redo 的进程首先要获得 redo copy latch, 这个 latch 可以让他们将自己的日志放进 log buffer 当中。 lgwr 在写 target log buffer disk 之前,应该等待直到这个 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 使用情况的变量 b i 。分配的空间的大小依据 chang vectors, 然后加上每块 16 字节的 block header 。空间一旦分配, redo allocation latch 就会被释放。 change vectors 会从进程的 pga 当中 copy log 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 。这样在做数据库恢复的时候,可以跳过 invalid entry
这时候,进程可能需要通知 lgwr log 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 是否被同步。

你可能感兴趣的:(oracle,log,buffer,redo,休闲)