Skip to content

redo vector

2.解析REDO:Records

前面一节讲到,一个redo logfile中包含了2部分内容,分别为Redo file header,Redo record。这里将对这2部分进行解析。
1.2.1 Redo logfile header
重做日志文件头的大小为512byte,在一个logfile的dump中可以在file header中找到 BLKSIZ=512.日志文件头主要记录的内容为当前日志的seq,rba,scn,logsize,log number,DBID,low rba,highrba等信息。(如下图)

Opcodes *.*
RBAs: 0x000000.00000000.0000 thru 0xffffffff.ffffffff.ffff
SCNs: scn: 0x0000.00000000 thru scn: 0xffff.ffffffff
Times: creation thru eternity
FILE HEADER:
Compatibility Vsn = 185597952=0xb100000
Db ID=3093517514=0xb86354ca, Db Name='11GOCMDB'
Activation ID=3093532362=0xb8638eca
Control Seq=1033=0x409, File size=102400=0x19000
File Number=2, Blksiz=512, File Type=2 LOG
descrip:"Thread 0001, Seq# 0000000014, SCN 0x0000000c76be-0xffffffffffff"
thread: 1 nab: 0xffffffff seq: 0x0000000e hws: 0x2 eot: 1 dis: 0
resetlogs count: 0x2f85bc4c scn: 0x0000.00081bca (531402)
prev resetlogs count: 0x27a409d9 scn: 0x0000.00000001 (1)
Low scn: 0x0000.000c76be (816830) 11/20/2013 23:37:48
Next scn: 0xffff.ffffffff 01/01/1988 00:00:00
Enabled scn: 0x0000.00081bca (531402) 10/21/2012 22:27:24
Thread closed scn: 0x0000.000c76be (816830) 11/20/2013 23:37:48
Disk cksum: 0xd4a3 Calc cksum: 0xd4a3
Terminal recovery stop scn: 0x0000.00000000
Terminal recovery 01/01/1988 00:00:00
Most recent redo scn: 0x0000.00000000
Largest LWN: 0 blocks
End-of-redo stream : No
Unprotected mode
Miscellaneous flags: 0x800000
Thread internal enable indicator: thr: 0, seq: 0 scn: 0x0000.00000000

1.2.2 Redo record header
Redo record主要由2部分组成,分别为redo record header和change vectors,在这里把change vectors我单独出来一章分析,因为在这一部分oracle在10g的前后做了比较大的变化(IMU),原理不同(1.1.5中有描述),这部分只讲解redo record header.

Redo record header 的内容大致如下:

REDO RECORD - Thread:1 RBA: 0x00000e.00000003.0010 LEN: 0x02a4 VLD: 0x05
SCN: 0x0000.000c76c2 SUBSCN: 1 11/20/2013 23:37:49

可以看到redo record header的内容主要包含信息为RBA,LEN,SCN,SUBSCN,THREAD等信息。因为这RBA和SCN个内容和redo标识中最重要的组成部分,下来对上面的RBA和SCN号做详细的解析

1. RBA(redo byte address)
在redo logfile中,没一个redo record都对应有一个RBA,记录这个record所处在的位置,RBA为10个字节大小,由三个部分组成,
分别为:
日志文件序列号(4字节)
日志文件块编号(4字节)
重做日志记录在日志块中的起始偏移字节数(2字节)

RBA: 0x00000e.00000003.0010

日志文件序列号:0x00000e
日志文件块编号:00000003
偏移字节数:0010
通常使用RBA的形式有:
LRBA (LOW RBA)

Redo log file中的LRBA (Low Redo Block Address) 表示脏数据块在buffer cache中第
一次被修改时候所对应的重做条目在重做日志文件中的地址 (Low表示第一次修改)
[LRBA0][LRBA1][LRBA2][LRBA3][LRBA4][LRBA5][LRBA6]

HRBA (HIGH RBA)

数据缓存(buffer cache)中一个脏块最近一次被更新的时候产生的重做日志记录在
重做日志文件中所对应的位置就称为HRBA。

checkpoint RBA

当一个checkpoint事件发生的时候,checkpoint进程会记录下当时所写的重做日志
记录的地址即RBA,此时记录的RBA被称为checkpoint RBA。从上一个checkpoint RBA
到当前的checkpoint RBA之间的日志所保护的buffer cache中的脏块接下来将会被写
入到数据文件当中去。

2. SCN(system change number)
也称作system commit number,一共有6字节长,格式为如下:

SCN: 0x0000.000c76c2

由2部分组成,

WRAP:0x0000(2bytes)
BASE:000c76c2(4bytes)

Base部分记录着当前数据库最新的scn,一般保存在record header中,rac中记录的为全局scn,分布式事务记录的为high scn。

关于scn更详细的内容可以参考
http://czmmiao.iteye.com/blog/1010267