Redo Write Triggers

有四个条件促使lgwr执行重做写出。

1.当lgwr空闲,它转入睡眠,等待rdbms ipc message事件超时3秒(与dbwr的做法一样)。如果,该睡眠超时,并且lgwr发现有一些重做要写出,自然的执行后台写操作

2.无论什么时候,进程在log buffer中分配空间时,要计算已使用过的log buffer blocks数目。如果以使用过的块数blocks大于或等于_log_io_size 参数指定的blocks数目,并且如果lgwr不是活动状态,那么,lgwr执行后台写。_log_io_size 的默认值是log bufferblocks总数的1/3,从oracle8开始最高上限是1m。像其他隐含参数一样,如果不是外部设置,_log_io_sizeX$KSPPSV中显示为0

3.当事务提交时,他在redo stream(重做流中)产生一个commit marker提交标记。但是,直到包含commit marker的log block涮出到磁盘后,该事务才可恢复。因此,在进程能够给用户返回一个响应前,他必须等待lgwr涮出那个log block到磁盘。此时进程通知lgwr写,接着他自己转入睡眠,等待log file sync事件超时1秒。为了及时完成,_wait_for_sync可以设置为false,避免等待redo的同步(即服务器进程不用等待lgwr写出重新做,就可以返回用户一个响应),但是,这样做,在实例失败后,以提交的事务的可恢复性没有保证。注意递归调用中的提交,(如过程代码中的execute calls)不必同步的等待redo写出,才把响应返回给用户。因此,recursive calls仅仅等待commit RBA写出,就返回用户调用。它们不同步每个commit。

一个sga变量kcrfshsb,用来记录log block number,低于该号的所有log block需要写出(An SGA variable (kcrfshsb, according to bug 182447) is used to communicate the log block number up to which the redo thread needs to be synced.)(也就是记录需要同步的最高块号)lgwr醒来前,如果几个不同事务都发生提交,该变量记录需要同步的highest log block number,接着所有提交标记在单次redo write,全部写到磁盘。

4.当dbmn需要写出数据块,而该块的high RBA大于LGWR's on-disk RBA,从8i开始,dbwnthose blocksdbwndeferred write queue(延迟写队列),并通知lgwr同步highest high RBA,但是dbwn不等待。相反,DBWn继续处理其他的不需要延迟的写操作。8i之前,这种情况DBWn通常转入睡眠,等待log file sync事件。


请使用浏览器的分享功能分享到微信等