针对上图进行简单的描述:
1、当user发起一个commit后;
2、前端进程(即Server 进程)会post一个信息给lgwr进程,告诉它,你应该去写redo buffer了。
3、当LGWR进程得到指示后,开始调用操作系统函数进行物理写,在进行物理写的这段时间内,会出现
log file parallel write等待。这里或许有人会有疑问,为什么12c之前只有一个lgwr进程,这里却是parallel
write呢?这里需要说明一下,lgwr进程在将redo buffer中的数据写出到log file文件中时,也是以batch方式
进程的(实际上,dbwN进程也是batch的模式),有相关的隐含参数控制。
4、当LGWR完成wrtie操作之后,LGWR进程会返回一个信息给前端进程(Server进程),告诉它,我已经写完了,你可以完成提交了。
5. user 完成commit操作。
这里补充一下,这是由于Oracle 日志写优先的原则,假设在commit之前redo buffer的相关entry信息不立即写到redolog file中,那么如果数据库出现crash,那么这是会丢数据的。
1、当user发起一个commit后;
2、前端进程(即Server 进程)会post一个信息给lgwr进程,告诉它,你应该去写redo buffer了。
3、当LGWR进程得到指示后,开始调用操作系统函数进行物理写,在进行物理写的这段时间内,会出现
log file parallel write等待。这里或许有人会有疑问,为什么12c之前只有一个lgwr进程,这里却是parallel
write呢?这里需要说明一下,lgwr进程在将redo buffer中的数据写出到log file文件中时,也是以batch方式
进程的(实际上,dbwN进程也是batch的模式),有相关的隐含参数控制。
4、当LGWR完成wrtie操作之后,LGWR进程会返回一个信息给前端进程(Server进程),告诉它,我已经写完了,你可以完成提交了。
5. user 完成commit操作。
这里补充一下,这是由于Oracle 日志写优先的原则,假设在commit之前redo buffer的相关entry信息不立即写到redolog file中,那么如果数据库出现crash,那么这是会丢数据的。
6.
|
1、进程接到提交请求 2、进程通过LGWR写redo数据到Redo文件 3、LGWR写Redo到文件 4、LGWR写完通知进程 5、进程收到写完成通知,向用户端发送提交完成。 从步1开始,进程开始等待log file sync,到步5结束。 步3、步4,LGWR等待log file parallel write。 log file sync比log file parallel write大很大,有两个原因,一是CPU紧张,二是同时提交的进程多。 你应该是第二种情况。 你想一下,如果10个进程同时提交,每个进程等0.1秒,加起来就一共等了1秒。而log file parallel write只会有一个进程等待, 就是LGWR。 |