================================================================================================================Redo Generation Architecture=============================四. Redo Generation Architecture (日志产生体系结构)
==================================================
四.一)概述
Oracle’s Redo Architecture consists of:日志的结构体系包含以下内容
  ·SCN(System Change/Commit Number)
·RBA(Redo Byte Address)
·Redo Record
·Change Vector
·Redo Log Files
·Redo Threads
·Redo Log Buffer
·Redo Stream
·Recovery Algorithms
·Checkpoint Structure
·Applying Redo
====================
四.一.一)Redo Generation Architecture日志产生体系结构阐述:
·SCN:记录了数据库一致性版本.SCN可以用于:
  –Redo Record Header日志记录头(可以记录事务commit)
  –Datafile Header
  –Controlfile
  –Block Header

 

·RBA(Redo Byte Address)用于记录出现在Redo Stream(Redo流队列)中的特定的Change Vector.包含三部分内容:
  –Log Sequence Number
  –Block Number of log
  –Offset of the block
RBA=10bytes
·Redo Record:Redo Record记录了数据库某一状态的版本(state version)
·Change Vector:记录了一个单独的Block(可能是block重构的block version?)的行为操作,该Block的一系列操作会使得Change Vector标志连续递增
·Redo Logfiles :日志文件记录了所有数据库块的更改的记录(甚至包含一些重组控制文件的信息).每个日志文件由thread中的thread number,sequence numbe,SCN来惟一标识.日志文件中的内容被逻辑的顺序排序来保持数据库更改的顺序一致,根据SCN来序列化,这对TX的ACID属性提供支持.
·Thread of Redo:由一个Instance产生的Redo被称为该Instance的Redo thread.每个Thread被写入自己私有的Redo logfiles.
  当前正在被写的日志被称为’Online Redo Logfiles’,它们可以在写完成够被Archive(copy)到磁盘.
  一个Thread可以同时拥有Online和archived组成部分.
  在OPS/RAC环境中,每个instance都有自己独立的redo,也就是说至少需要4日志
  在恢复Recovery的时候,衍生重组的Redo Thread接管Redo Thread来提供日志的逻辑序列化(logic ording)
·Checkpoint Structure:
  CKPT结构定义了Redo Stream日志流中的某特定’状态点’,该状态点之前的所有数据库更改已经被DBWR写入磁盘.
  CKPT包含结构:
     –Checkpoint SCN
     –Eabled Thread bit vector(用于标志在checkpoint期间使哪个那个Thread的二进制位)
     –Timestamp
     –Number of Thread that initiated the checkpoint(OPS/RAC环境)(发起该ckpt的实例instance数量)
     –RBA

===================
四.一.二)SCN(System Change/Commit Number) SCN概述
·Describe the “Version “ or the commited Verion of a Database stat.(描述数据库状态的’状态版本’/’Commit状态版本’)
·SCN=6bytes(Base4byes+Wrap2bytes)
    –Base SCN:在新的SCN分配的时候递增
    –Wrap:在Base SCN到达上限的时候增加
·多Instance(RAC/OPS)的数据库维护一个全局SCN(Global SCN)
概述::
 ——————-
  1.SCN分配:
    SCN描述数据库状态的’状态版本’/’Commit状态版本’.
    一条查询会返回数据库内容,这些内容是一特殊的SCN号来体现
    SCN用来在Redo Record头记录提交的事务
    SCN也用来保存在Redo Record中用来标记在某些特殊SCN后的分配的Redo
    SCN也可以被存放在数据文件头结构中如:控制文件Controlfile/Datafile Header
————————-
2.SCN时间上限限制:
    SCN至少48位,因此可以在524年内以为16384/s的速度进行分配也不会消耗完SCN,按照这个速度Oracle数据库将会在2522年消耗完毕
————————
3.SCN:多实例muti-instance
在多实例muti-instance环境中,有Current SCN和Recent SCN的区别(在单实例中都是一样的).
Current  SCN是最接近全局(Global)时间系统的SCN,保存在Block value Block的结构中被一个称为SC的全局锁Global lock进行维护.
Recent SCN是Current SCN的缓存值(缓存在本地?)
======================================================
四.二)SCN 正题相关
======================
四.二.一)SCN
·Assign to a TX where it commits(在事务提交时候分配给事务)
·Increases monotonically(单调的递增)
·SCN会跳跃式递增,在分布式事务和OPS/RAC环境中.
·Used for(适用于):
— Concurrency Control(并发控制)
— Redo Log Ordering(重做日志逻辑排序)
–Recovery(恢复)
======================
四.二.二)RBA (Redo Byte Address)
·RBA:RBA标志存储与在线/归档日志中的Redo Record的开始.因此它指向了某个read thread的redo record的确切位置.
·RBA存储在所有在数据文件头datafile header、控制文件的数据文件条目中,如控制文件:
******************************* ********************************************
DATA FILE RECORDS
***************************************************************************
 (size = 428, compat size = 428, section max = 100, section in-use = 15,
  last-recid= 278, old-recno = 0, last-recno = 0)
 (extent = 1, blkno = 11, numrecs = 100)
DATA FILE #1:
  (name #3) /opt/ora_data/FSXYBAK/datafile/system.dbf
creation size=38400 block size=8192 status=0xe head=3 tail=3 dup=1
 tablespace 0, index=1 krfil=1 prev_file=0
 unrecoverable scn: 0x0000.00000000 01/01/1988 00:00:00
 Checkpoint cnt:433 scn: 0x0000.0036bf85 01/01/2010 04:14:08
 Stop scn: 0xffff.ffffffff 12/31/2009 05:27:17
 Creation Checkpointed at scn:  0x0000.00000006 06/30/2009 22:13:01
thread:1 rba:(0x1.3.10)

·RBA用来快速定位用于恢复的Redo位置
示例:Record Record
REDO RECORD – Thread:1 RBA: 0x000080.00013c63.0010 LEN: 0x036c VLD: 0x0d
SCN: 0x0000.00299b5a SUBSCN:  1 10/31/2009 14:47:48
·标志着Redo Record的开始
·10bytes长
·三个组成部分:
–Log Sequence Number(日志序列号)
–Block Number within the redo log(重做日中中的block号)
–Bytes Number with the block(Block中的offset偏移量)

======================
四.二.三) Redo Records
·描述了数据库原子级别的更改
·包含了1到多个Change Vectors
·创建时间先于更改Buffer
·在应用Record Rcord中的更改时候可以保证恢复所有或者完全不能保证(就是说每种恢复一点的说法,所谓actomic原子不可分离性)
·这种原子级别的保证是Cache Layer层工作的补充和完善.
·Order by SCN号(RBA 保证逻辑的有序性)
概述:
由一系列的Change Vectors组成的Redo Record描述了原子级别的数据库更改.
一个事务可以产生多个Redo Records  (1)TXß—à(N) Redo Records
一个Record Record允许记录多个数据库Block更改(不同的Database Block更改可以保存在一个Record Record中)来保证所有的更改或者不更改都能被记录如数据库日志Redo logfiles,除了非正常的强行的介入外),如下图一个Record记录了所有的更改
REDO RECORD – Thread:1 RBA: 0x000080.000000c5.00a8 LEN: 0x0128 VLD: 0x01
SCN: 0x0000.00294c93 SUBSCN:  2 10/31/2009 06:14:21
   CHANGE #1 TYP:0 CLS:18 AFN:2 DBA:0x00800d5e OBJ:4294967295 SCN:0x0000.00294c93 SEQ:  1 OP:5.1
    ……………
   CHANGE #2 TYP:2 CLS: 1 AFN:1 DBA:0x00401024 OBJ:518 SCN:0x0000.00294c8d SEQ:  1 OP:10.2
Record Record以为SCN为参照进行逻辑排序存储:
   ·SCN 是单一的递增
   ·CHANGE SCN被用于Redo日志逻辑的有序化
   ·Commit用于标志事务TX的提交

示例:
REDO RECORD – Thread:1 RBA: 0x000080.000000c5.00a8 LEN: 0x0128 VLD: 0x01
SCN: 0x0000.00294c93 SUBSCN:  2 10/31/2009 06:14:21
CHANGE #1 TYP:0 CLS:18 AFN:2 DBA:0x00800d5e OBJ:4294967295 SCN:0x0000.00294c93 SEQ:  1 OP:5.1 –CV1:
ktudb redo: siz: 100 spc: 942 flg: 0x0022 seq: 0x00e0 rec: 0x3f
            xid:  0x0001.00d.00000226 
ktubu redo: slt: 13 rci: 62 opc: 10.22 objn: 518 objd: 518 tsn: 0
Undo type:  Regular undo       Undo type:  Last buffer split:  No
Tablespace Undo:  No
             0x00000000
index undo for leaf key operations
KTB Redo
op: 0x04  ver: 0x01 
op: L  itl: xid:  0x0001.000.00000225 uba: 0x00800d5e.00e0.3c
                      flg: C—    lkc:  0     scn: 0x0000.00294c8d
Dump kdilk : itl=2, kdxlkflg=0x1 sdc=0 indexid=0x401021 block=0x00401024
(kdxlpu): purge leaf row
key :(10):  06 c5 2b 5f 60 0b 27 02 c1 04
CHANGE #2 TYP:2 CLS: 1 AFN:1 DBA:0x00401024 OBJ:518 SCN:0x0000.00294c8d SEQ:  1 OP:10.2 –CV:2(op:10.2)
index redo (kdxlin):  insert leaf row
KTB Redo
op: 0x11  ver: 0x01 
op: F  xid:  0x0001.00d.00000226    uba: 0x00800d5e.00e0.3f
Block cleanout record, scn:  0x0000.00294c93 ver: 0x01 opt: 0x02, entries follow…
  itli: 2  flg: 2  scn: 0x0000.00294c8d
REDO: SINGLE / — / —
itl: 2, sno: 187, row size 20
insert key: (10):  06 c5 2b 5f 60 0b 27 02 c1 04
keydata: (6):  00 40 10 13 00 2e
·Redo Record包含一系列的CV(change vectors)
·上述示例中包含2个CV:
  –CV1:Op(5.1) Change Vector for undo blocks(事务开始)         –5.2 Undo segment header(事务回滚)
  –CV2:Op(10.2)Insert Leaf Row(插入索引叶子节点)