Oracle Database 进程协作
Server ProcessOracle数据库中sql语句的执行主体,全权代理并执行客户端的请求。
将数据文件中的block读取到buffer cache中。
在修改buffer之前,生成重做日志并写入log buffer,之后根据sql语句修改buffer
CKPT
将检查点位置写入控制文件和数据文件首部,之后通知dbwr将server process修改的buffer分批次写回数据文件。
DBWR
将server process修改的buffer分批次写回数据文件(datafile)。
LGWR
将server process生成的重做日志写入重做日志文件(redo log file)。
Server Process执行完sql语句后,需要提交sql语句,提交sql语句代表对数据库的修改已真正写入数据库,而此时真正写入数据库的只是重做日志。lgwr将这个sql语句相关联的重做日志从log buffer写入重做日志文件中,lgwr写入完成就代表sql语句已成功提交。至于这个sql语句已经修改的buffer是否已经写回数据文件,与sql语句是否提交没有必然的联系,ckpt会定期通知dbwr将那些修改过的buffer分批次地写回数据文件。
检查点队列(checkpoint queue)
buffer按照第一次被修改的时间顺序在检查点队列中排序,如果一个buffer被修改了多次,那么该buffer在检查点队列中的位置不变。
检查点位置(checkpoint position)
buffer第一次被修改时,所对应的重做日志条目在重做日志文件中的地址(LRBA)。
在检查点队列中仅存在BH,BH记录了buffer的地址与buffer对应的LRBA。
在检查点事件发生时,ckpt将检查点队列中当前第一个buffer对应的LRBA写入控制文件,之后通知dbwr写dirty buffer,在dbwr写入完成后,删除检查点队列上已写入的dirty buffer。
检查点位置就是实例恢复的起点,因为在这个位置之前的dirty buffer已经在检查点事件中被dbwr写回数据文件。
检查点事件发生的越频繁,buffer cache中的dirty buffer越少,实例恢复的时间越短,反之,buffer cache中的dirty buffer越多,实例恢复时间越长。
页:
[1]