Oracle Database 进程协作

在oracle数据库中真正执行sql语句的主体是服务器进程(Server Process),服务器进程又称为shadow process,如同客户端进程的影子一般,全权代理并执行客户端的请求。


服务器进程接收一条sql语句需要修改数据库中某个表的记录,那么第一步就是要找到这个表的记录,表的记录都保存在数据文件的某些block中,而CBO可以告知服务器进程如何迅速找到这些block。服务器进程会询问CBO,根据CBO的建议将数据文件中的这些block读取到DB cache的buffer中。


服务器进程在修改某个buffer之前,必须先记录准备如何修改这个buffer并将记录保存在log buffer中,那些记录如何修改buffer的记录称为redolog,之后服务器进程才会真正修改这个buffer,这个被修改的buffer称为dirty buffer。


服务器进程完成buffer的修改后,需要提交这个sql语句,提交就是指lgwr将这个sql语句相关联的redolog从log buffer写入redo log file中,redolog成功写入就代表sql语句已成功提交。至于这个sql语句已经修改的buffer是否已经写回数据文件,与sql语句是否提交没有必然的联系。那么dirty buffer何时写回数据文件呢?在检查点执行过程中,dbwr进程负责将dirty buffer写回数据文件


什么是检查点事件

检查点队列

buffer会根据第一次被修改的时间顺序在检查点队列中排队,如果一个buffer被修改多次,这个buffer在检查点队列中的位置不变。


检查点位置

检查点队列中的每个buffer都会存在与之关联的redo log,检查点队列中的buffer对应的redo log在redo log file中的地址称为检查点位置


检查点事件

ckpt通知dbwr将检查点队列中部分buffer写回数据文件,dbwr将检查点队列中部分buffer写回数据文件后,删除检查点队列中已写回数据文件的buffer,并告知ckpt检查点位置,ckpt将检查点位置写入控制文件


较早时间修改的buffer靠近检查点队列的尾部,最近修改的buffer靠近检查点队列的首部,dbwr应该从检查点队列的尾部选择部分buffer写回数据文件


猜你喜欢

转载自blog.51cto.com/13598811/2151177