有关RBA
rba = redo byte address
rba用于快速的定位redo entry(redo file->redo block->redo entry)
rba可以不唯一,比如我们用resetlogs打开数据库后,redo sequence会被重置。
buffer cache中的dirty block都可能做过很多次改动,每次改动都会有相应的redo entry生成,一个dirty block被读到buffer cache后第一次被改动时生成的的redo entry的rba叫做这个dirty block的low rba,相反最近一次更改的rba叫做high rba.
buffer cache中有条很重要的hash chain:ckpt queue list,这个list上是一个个首位相连的buffer header,这些buffer header指向buffer cache中的dirty block,这些dirty block在第一次被改动时其buffer header就被链到ckpt queue list上,每个dirty block的buffer header在ckpt queue list只出现一次,而不论这个dirty block随后是否还被更改过(改一次和改N次对于dbwr是无所谓的,dbwr只要知道是否dirty而不需要知道dirty了多少次)。ckpt queue list上所有的buffer header按照其指向的dirty block的low rba进行排序,因此最先被更改的dirty block会排在前面,由于dbwr是按照ckpt queue list上的顺序去写dirty block(只是按照这个顺序,具体写应该是从lru-w或者叫write list,dirty list上完成),所以最先被改的block最先被写出,当dbwr写完dirty block后就把其buffer header从ckpt queue list上摘掉,因此ckpt queue list的最小的那个low rba就定期的被ckpk进程记录到control file中(low cache rba),作为记录dbwr写dirty block的进度,同时也作为instance recovery开始的位置(因为在这个low rba之前的所有redo entry对应的dirty block都已经被dbwr写到data file了),而current redo log file中最后的redo entry的rba将作为on disk rba也被ckpk进程写进control file,同时ckpt进程还会写scn,heartbeat值.
instance recovery从low cache rba开始,到on disk rba结束,那么这之间的redo entry的条目数就直接决定了instance recovery的时间,也间接决定了dbwr写dirty block的速度。这个条目数由fast_start_mttr_target或fast_start_io_target等参数决定,同时还必须满足小于最小log file的90%
。