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

2014-11-24 18:43:08 · 作者: · 浏览: 0

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释放。