Home  >  Article  >  Database  >  理解redo(2)redo内容:change vector和redo entries

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

WBOY
WBOYOriginal
2016-06-07 17:18:35963browse

每次修改cache buffer中的这些block时,需要先在PGA中生成对应的change vector,然后由server process从PGA copy到SGA REDO LOG

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 records,或者全部被写、或者全部不写。

   

    由于user process 向redo log buffer写数据,所以需要latch保护:
    redo copy latch:写redo 到redo log buffer
    redo allocation latch:控制log buffer分配
    在将PGA中redo copy到 log buffer时,获取redo copy latch,获取后接着获取redo allocation latch 分配redo log buffer空间,分配后释放redo allocation latch,然后server process 将PGA中redo信息 COPY 到redo log buffer,OK 后redo copy latch释放。

linux

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn