日期:2014-05-16  浏览次数:20466 次

理解redo(2)redo内容:change vector和redo entries

    redo log file由redo records(又名redo entries)组成。一条redo record由一组change vectors构成。

    redo record:是change vector的集合。每个redo record是由多个change vector组成的。oracle在恢复过程中,会保证一个transaction要么被全部恢复,要么全部不恢复。实际上就是通过恢复redo record中的全部change vector来做到的,只要有一个change vector恢复失败,这个redo record的所有change vector都将失败。所以,redo record是构成数据库变更的最小恢复单位。

    change vector:表示数据库内某一个数据块所做的一次变更。一个CV只针对一个数据块的变更,一个CV只包含一个变化。

            这个数据块可以是:

                数据块data block
                回滚块undo block
                数据段头块data segment header block
                回滚段头块undo header block   

   

    Change vector的结构,包含一个头信息和身体信息。
        change vector header主要包括:
                 change #n:同一个redo record中的change vector的编号
                 TYP:变更类型
                 CLS:本次修改对应的block的类别,等于x$bh.class
                 AFN:绝对文件号
                 DBA:回滚块地址
                 SCN:修改时的SCN
                 SEQ:同一个SCN的不同修改以seq编号,注意:在oracle中,序列号的本质是,不同序列号都是对应不同的内容
                 OP:操作码,由两部分组成,layer code. sub code

       change vector body主要包括:
                1)变更数据块的版本号:在建立change vector时oracle会从data block copy其版本号,在做前滚的时候,通过REDO LOG文件里记录的change vector,根据SCN的比对,提交到相关的数据文件上,从而使数据文件的状态向前滚动,被恢复的数据块版本号加一(临时段的数据块不会生成change vector)。注意,重新运用redo来recover,这是个二元运算的过程,并不会产生sql!
               2)DBA:回滚块地址
               3)事务操作代码
               4)更新后的数据

 

    每次修改cache buffer中的这些block时,需要先在PGA中生成对应的change vector,然后由server process从PGA copy到SGA REDO LOG BUFFER。user process修改数据时产生redo entries,此时redo存于pga中,将PGA中redo copy到 redo log buffer 需要redo copy latch,LGWR只有等待进程COPY 完成才能把目标log buffer block写入redo log file。redo entries在内存中是占用连续的顺序的空间,他是按顺序写入到redo log file,其块大小不同于数据块大小是由db_block_size参数设置的,而是在Oracle源代码中固定的,和os相关,大部分os中都是512字节。只有当一个事务所包含的全部redo records被安全着陆到磁盘,user process才能得到commit completed的通告。redo log buffer里面的redo re