LogBuffer写入Redo Log的条件:
1).用户提交
2).有1/3重做日志缓冲区未被写入磁盘(可以通过修改_LOG_IO_SIZE参数来控制 )
3).有大于1M的重做日志缓冲区未被写入磁盘
4).每隔3 秒钟
5). DBWR 需要写入的数据的SCN大于LGWR记录的SCN,DBWR 触发LGWR写入。
LGWR写的具体过程:
1).先尝试获取redo writing latch,确保其他process不会继续触发lgwr(这里可能会产生log file sync等待事件)
2).获取redo allocation latch(public redo allocation latch),防止有新的change vector继续写入log buffer,造成LGWR无法确定应该写多少redo.
3).LGWR确定写的范围(从上次lgwr启动所写的最后一个日志块到这个时间点时的最后一个被使用的所有写满or未写满的日志块)此时前台process仍可以向这个范围内的redo block(buffer)写内容(从PGA写)所以lgwr不阻碍其它进程获得redo copy latch(即:不阻止其它进程向log buffer 中可用块中写change vector)
4).确定redo block(buffer)后生成新SCN号
5).LGWR释放redo allocation latch与redo writing latch
6).LGWR需要等待 其它进程对要写入日志文件的block的更新操作完成(pga-log buffer的操作),通过判断日志block(buffer)上的redo copy latch是否都释放。
7).将第4步scn号copy到要写入logfile的log buffer的块头里,然后触发物理的写操作,将这些待写日志