DBWn跳过高RBA位于LGWR的on-disk RBA之上的块,将其放入DBWn的等待队列中。其后,检查
DBWn跳过高RBA位于LGWR的on-disk RBA之上的块,将其放入DBWn的等待队列中。其后,检查点位置发生过变化,如果此时停电,这些在等待队列中的块,如何被恢复?
http://www.ixora.com.au/notes/redo_write_triggers.htm
看上面文章中的第四点,有一点疑问:
4. 当DBWN需要写一个或更多的块,而这些块的高RBA位于LGWR的on-disk RBA之上,从8I开始,它就先把这些块放到它的延迟写队列里,然后催促LGWR去同步更高的高RBA,但是它不会等待,相反DBWN继续执行其它不需要进行延迟的写进程。而在8I之前的版本,DBWN在这种情况下常常会进入休眠状态,并出现log file sync wait 事件
说的是:dbwr 需要写dirty block写到datafile,在写之前,它去通知LGWR去写这些block 到日志,可是,lgwr正在忙着写RBA 比这些block 的RBA低的block呢。那么dbwr并不等待LGWR完成,而是把这些信息放入DBWn的等待队列,自己就去忙别的去了
问题是:
DBWn跳过高RBA位于LGWR的on-disk RBA之上的块(假设此块是A),应该是继续写检验点队列后面的块,检查点位置(checkpoint position)会由CKPT每三秒一次写进控制文件,假如此时的检查点位置已经高于块A,而块A对应的重做块还没有被LGWR写进日志,哪么块A更加没有被DBWn写进数据文件,也就是说块A还在DBWn的等待队列里面。如果此时停电了,由于检查点位置高于块A,Oracle进行事例恢复时是从检查点位置处开始,哪么块A如何能得到恢复呢?
相关文章