各位:
    如果现在有一个数据块已经更新,但还未提交,是否会在  checkpoint queue中。按照我的理解,他还没有scn号。
同时,这种类型的块如果被换出,数据更新到数据文件,那么这时他应该也在lrum中被换出,此时和checkpoint queue有什么联系。谢谢

解决方案 »

  1.   

    数据缓冲中更新未提交的数据块会被 checkpoint 刷新到数据文件,并且与此更新事务相关的 undo 段的数据块也会被刷新到 undo 表空间的数据文件,因为它们的 scn 都小于 checkpoint 的 scn。在数据缓冲中,即使更新未提交,也会修改相关数据块上的 scn,这样查询操作才能通过比较数据块上的 scn 保证读一致性。
      

  2.   

    在不在checkpoint queue中,由mttr确定,也就是说增量检测点或日志切换(全量检测点)有关,checkpoint queue 对应的是rba的范围,与是否提交没什么关系;另外block清不清出既与lru有关(即count),也与checkpoint有关。对于scn,block中的cache层对应change scn,事务层会有commit scn或cleanout scn,对于查询,oracle会比较commit scn与查询时的scn比较,如果大于commit scn,就读该块,否则复制该块,通过事务层的相关信息找到undo重构一个一致性块。
      

  3.   

    CKPT(检查点进程)    DBWR/LGWR的工作原理,造成了数据文件,日志文件,控制文件的不一致,CKPT进程负责同步数据文件,    日志文件和控制文件    CKPT会更新数据文件/控制文件的头信息       条件:       在日志切换的时候       数据库用immediate ,transaction ,normal选项shutdown数据库的时候       根据初始话文件LOG_CHECKPOINT_INTERVAL、LOG_CHECKPOINT_TIMEOUT、FAST_START_IO_TARGET 的设置的数值来确定       用户触发因此检查点队列与commit没有关系,有关增量检查点的详细内容,可以参考这里:
    Oracle 实例恢复