理解redo(2)redo内容:change vector和redo entries
每次修改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释放。
上一篇: 用Java连接php-fpm
下一篇: 多个Tomcat和JDK启动问题