Chinaunix首页 | 论坛 | 博客
  • 博客访问: 509231
  • 博文数量: 101
  • 博客积分: 1635
  • 博客等级: 上尉
  • 技术积分: 1282
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-05 01:51
文章分类

全部博文(101)

文章存档

2019年(2)

2018年(16)

2013年(14)

2012年(69)

我的朋友

分类: Oracle

2018-10-31 10:44:58

redo logfile的结构
关于redo logfile的文件结构,大概是如下一个关系:
block 0:file header
block 1:redo header
block 2 :redo record 1
block 3 : redo record 2
block n :redo record n


我们使用oracle自带的dbfsize工具来查看redolofile信息:
[oracle@localhost ~]$  dbfsize /u01/app/oracle/oradata/orcl/redo02.log 


Database file: /u01/app/oracle/oradata/orcl/redo02.log
Database file type: file system
Database file size: 102400 512 byte blocks


redo logfile的block size 是512byte,包含102400个块。


第一个是os header


[root@oracle-ogg ~]# dd if=/home/oracle/app/oradata/oracleogg/redo02.log bs=512 skip=1 count=1|od -x
0000000 2201 0000 0001 0000 0056 0000 8000 c067                 --15
0000020 0000 0000 0400 0b20 64cc 88b1 524f 4341                 --31
0000040 454c 474f 261e 0000 9000 0001 0200 0000                 --47
0000060 0002 0002 b533 88fb 0000 0000 0000 0000                 --63
0000100 0000 0000 0000 0000 0000 0000 0000 0000                --79
0000120 0000 0000 0000 0000 0000 0000 6854 6572                --95
0000140 6461 3020 3030 2c31 5320 7165 2023 3030                --111
0000160 3030 3030 3030 3638 202c 4353 204e 7830                --127
0000200 3030 3030 3030 3632 3833 6465 302d 3078                --143
0000220 3030 3030 3230 3836 6262 0030 1c25 0001                --159
0000240 945c 3516 1576 001c 0000 0000 0004 0000              --175
0000260 0001 0000 38ed 0026 0000 0000 b384 3559            191
0000300 8bb0 0026 0000 0000 6d41 355d 0000 0208
0000320 1576 001c 0000 0000 945c 3516 8bae 0026
0000340 0000 0000 b60a 3559 0000 0000 0000 0080
0000360 0000 0000 0000 0000 0000 0000 0002 0000
0000400 0000 0000 0000 0000 0000 0000 0000 0000
0000420 0000 0000 0000 0000 0000 0000 027b 001c
0000440 0000 0000 6d28 3516 0000 0000 0000 0000
0000460 0000 0000 0000 0000 0000 0000 0000 0000
*
0000700 d132 b1cf 497b 9cc4 6863 b4b6 c7c2 8231
0000720 1096 46ef 7a46 0e21 7f9a d2a0 92d1 73fb
0000740 0005 0000 0000 0000 0000 0000 0000 0000
0000760 0000 0000 0000 0000 0000 0000 0000 0000
0001000
1+0 records in
1+0 records out
512 bytes (512 B) copied, 0.00104118 s, 492 kB/s
offset 0~1:2201一表示这的redo logfile block,每个redo block头都是这值(跟平台有关系)
offset 4~5:0001一表示redo log block number号
offset 8~9:0056一表示redo log sequence number号
offset 12~13:8000一表示offset值(byte number with block)
上述三部分内容组合在一起,其实就是我们的redo rba信息:
RBA:logseq+log block nunmber+offset=0x000056.00000001.0080
offset 14~15: c067一表示checksum值,oracle是根据异或算法进行计算的。
offset 20~23:0400 0b20一表示db version,转换后可以跟我们的redo dump进行比较:Compatibility
offset 24~27:64cc 88b1一表示DB ID值
offset 28~35: 524f 4341 454c  474f 一表示DB name,如下:




SQL> select hextostr('4f 52 41 43 4c 45 4f 47') from dual;


HEXTOSTR('4F5241434C454F47')
--------------------------------------------------------------------------------
ORACLEOG




create or replace function hextostr(hexstr varchar2)return varchar2 is
i    number;
  s    char;
  str1 varchar2(20);
  rst  varchar2(200);
begin
  i   := 1;
  rst := '';
  Loop
    str1 := substr(replace(hexstr, ' '), i, 2);
    select chr(to_number(str1, 'xxxxxxxxxx')) into s from dual;
    rst := rst || s;
    exit when i > lengthb(hexstr);
    i := i + 2;
  end loop;
  return rst;
end;
/


offset 36~37:261e一表示control seq值,转换为10进制
offset 40~43:9000 0001一表示file size,单位是redo block.即表示redo block个数.
offset 44~45: 0200一表示redo block size大小,转换为10进制后为512.
offset 48~49:0002一表示file number号,表示redo的第2个文件
offset 50~51:0002一表示file type值,redo文件这个file type都是这个值。
offset 52~55: b533 88fb一表示Activation ID值,因为我这里是32位系统,字节序是反的,所以实际上是fb8833b5


offset 92~153:这部分内容表示的redo dump中的descrip信息,下面进行分解:
--offset 92~103: 6854 6572 64612c31表示Thread 0001,注意,一个字符都不能少。
--offset 104~121:5320 7165 2023 3030 3030 3030 3030 3932 202c表示Seq# 0000000029,
--offset 122~513:4353 204e 7830 3030 3030 3030 6636 3066 6137 302d 6678 6666 6666 6666 6666 6666表示SCN Ox0000006ff07a一Oxffffffffffff


offset 154~159 : 0066 ffff ffff一表示thread nab值,即:nab: Oxffffffff
offset 160~163:6688 3068一表示resetlogs count值
offset 164167:  17eb 006c一表示resetlogs时的scn值
offset 173:O1 一表示hws值
offset 177: O1 一表示eot值
offset 180~183:f07a 006f 一表示Low scn值
offset 184~187:b384 3559 一表示low scn timestamp值这里是如何计算的呢?
---计算low scn timestamp值
select ((((((2015-1988))*12+(4-1))*31 +(26-1))*24+(19))*60+(10)*60+(16))redo_time from dual;
select to_char(13563676,'xxxxxxxx') from dual;


offset 188~193:ffff ffff ffff 一表示next scn值,当实例处于运行状态时,next scn总是被置于最大值
offset 194~197:0000 0000   一表示next scn timestamp值,当实例运行时被置于01/01/1988 00:00:00
offset 204~207:17eb 006c   一表示enable scn值
offset 212~215:6688 3068    一表示enable scn timestamp值,该值的计算方式跟上面类似,如下:


select ((((((2015-1988))*12+(4-1))*31 +(7-1))*24+(20))*60+(46)*60+(00))redo_time from dual;
select to_char(14609880,'xxxxxxxxxx') from dual;


offset 216 ~ 219:f07a 006f一表示thread closed scn值,字节序是反的,实际上是:006f07a
offset 224~227:5c98 3081一表示thread closed scn对应的timestamp值,计算方式类似。
offset 284~287:Oa2f 006c一表示pre resetlogs的scn值,实际上的值是:Ox006c0a2f
offset 292~295: d3513067一表示prev resetlogs count值,由于字节序是反的,所以实际J=是Ox3067d351


redo record
我们知道redo logfile 除开前面的redog header之后,接着就是redo record 记录,而每个record记录也都存在一个record header.


我这里的redo logfile dump前面的一个record记录如下:
REDO RECORD一Thread:l RBA: Ox00001d.00000002.0010 LEN: 0x0150 VLD: 0x05
SCN: Ox0000.006ff07b SUBSCN: 1 04/26/2013 19:10:17
CHANGE #1 TYPO CLS: 1 AFN:3 DBA:Ox00c09876 OBJ:4222 SCN:Ox0000.006ff078 SEQ: 19 OP:11.2
KTB Redo
op:Ox02 ver:Ox01
op: C uba: Ox01800780.096c.01
KDO Op code: IRP row dependencies Disabled
  xtype: XR flags: 0x00000000 bdba: Ox00c09876 hdba: Ox00c00523
itli:2 ispac:0 maxfr:4858
tabn: 0 slot: 81(0x51) size/delt: 60
fb:一H一FL-- Ib: 0x0 cc: 15
null:
col 0:[3] c2 34 60
col 1:[2] c104
col 2: [13] 78 71 O1 if 07 O1 39 2d fe 66 18 Oc 3c
col 3:[2] c10b
col 4:[1] 80
col 5:[1] 80
col 6:[1] 80
col 7:[2] c102
col 8:[2] c102
col 9:[1] 80
col 10:[1] 80
col 11:[2] c103
col 12:[2] c102
col 13:[2] c107
col 14:[7] 78 71 01 18 06 2d 1d


redo record header ---REDO RECORD一Thread:l RBA: Ox00001d.00000002.0010 LEN: 0x0150 VLD: 0x05
SCN: Ox0000.006ff07b SUBSCN: 1 04/26/2013 19:10:17


这两个表示redo record header


BBEDBeget; set file 1 block 2
      FILE#     1
BLOCK#      2
BBED&get; d /v count 512
File: /home/oracle/app/oradata/oracleogg/redo02.log (1)
Block: 2   Offsets:  0 to 511 Dba:Ox00400002
01220000 02000000 1d000000 10801e041.”........……
50010000 05100000 7bf06f00 01000000 I P.......{膊..…
00000000 10002103 00000100 8a0400001……!...……
8a040000 00000000 7bf06f00 00006f00 I ..……{膊...o.
00000000 24007e10 Ob020100 030000001.…$.~...……
995c8130 Ob020100 03000000 7698c000 I .\.0........v.
78f06f00 00000000 13007e10 24001000 I x膊......一$…
32000300 02000d00 02000100 01000100 I 2...............
02000200 01000100 02000200 020007001 ..........……
0201424100000000 80078001 6c090100!二BA........L..
7698c000 2305c000 fa120202 02000000 I v.#.......
2c000f00 02f5f30a c74a0300 00000000!,.…蹬.筱……
00000000 01000000 3c005100 OOOOOOb71 ..……<.Q....
Oa16020a c2346024 c104900c 7871011f I ....}$..xq二
0701392dfe66180c3c190100c10b1e38!..9一主二<....8
8005c000 800a6f00 800b1829 c1020209 I ....o....)二
c1020203 80260e00 80062c00 c103ffff I…&.…,…
c1028001 c1076f00 78710118 062dldff I二o.xq.一
05062c00 0600ffff 8007800178f06f00 I二,.........x膊.
0000080d 3400ffff 06001800 08000000!....4...........
7e100000 7e100000 02000000 000000001~…~.....……
Ob010703 10002103 641d0000 02000000 I ......!.d.......
44000000 01000000 7bf06f00 01006f00 I D.......{膊...o.
00000000 Oe008010 Od160800 030000001 ..........……
Oa98c000 78f06f00 OOOOOdOd 05007e10 I ..x膊......一
04001000 04000000 01000000 04000000!..........……
2d000000 90000000 01000000 7bf06f00 I-.....……{膊.
01001800 00000000 80100000 Oa0501001 ..........……
03000000 758cc000 78f06f00 00001829 I ....u.x膊.…)
93008010 06001000 0600ffbf 02011300 I ........……
0600ffbf 7f078001 6c093b00 0201c600 I ......L;...
17000100 05062c00 0600ffff 80078001 I……,...……
<16 bytes="" per="" line="">get;


offset 0~1:2201一表示这的redo logfile block,每个redo block头都是这值(跟平台有关系)
offset 4~5:0002一表示redo log block number号,这是第2个block,所以这里是2.
offset 8~9:00ld一表示redo log sequence number号
offset 12 :10一表示offset值(byte number with block)
上述三部分内容组合在一起,其实就是我们的redo rba信息(记住rba一共占据10个byte,分别是4-4-2):
RBA:logseq+log block nunmber+offset二0x00001d.00000002.0010
offset 16~17:5001一表示len值,转换后为0150,即使150.转换为10进制是336.每个redo record的开始值都是这个len值,目的是
为了快速方便的定位redo recordo


offset 20N21 : 051一表示VLD值关于该值,有如下几种属性:
Mnemonic     Value   Description
KCRVOID      0   The contents are not val记
KCRVALID     1   Includes change vectors
KCRDEPND      2   Includes commit SCN
KCRVOID      4   Includes dependent SCN
KCRNMARK      8    New SCN mark record. SCN allocated exactly at this point in the redo log by this instance
KCROMARK      16   Old SCN mark record. SCN allocated at or before this point in the redo. May be allocated by another instance
KCRORDER      32   New SCN was allocated to ensure redo for some block would be ordered by inc/sep# when redo sorted by SCN


VLD :0x05表示4+1


在10g版本中,redo record header长度通常是24个byte,但是也可以在某些情况下增长到68个byte。
offset 24~27:f07b 006f一表示redo record scn值.转换后为Ox006ff07b
offset 28~29:0100一表示SU BSCN值,这个意义不大,占据2个byte。
offset 80~83:995c8130一表示redo record scn对应的timestamp值


change vector
我们知道每个record记录是由一系列的change vector组成的,而每个change vector对应做一个数据块的改变。
每个change vector的结构大概是如T样子:
change header一>;
length vector一>t;
change recordl一>;
change record2一>;


offset 70~71:7e10一表示change vector中的obj号
offset 72~73:0b02一表示opcode,转换后表示11.2 ,即为insert.
offset 74:  01 一表示block classtype。01表示data block。 block class有如下一些属性值:
Block Class   Description
1    Data block
2    Sort block
3    Save undo block
4    Segment header
5    Save undo header
6    Free list
7    Extent map
8    1st level bitmap block
9    2nd level bitmap block
10    3rd level bitmap block
11    Bitmap block
12    Bitmap index block
13    File header block
14    Unused
15    System undo block
16    System undo block
17    Undo header
18    Undo block
offset 76:03一表示绝对文件号,这里是03,表示。bj所在的绝对文件号是3.
offset 92~95:7698c000一表示dba值。
offset 136~142:80078001 6c0901一表示uba地址.
offset 144~147: 7698c000一表示bdba地址
offset 148~151: 2305c000一表示hdba地址
需要记住一点的,每个change vector的开始位置都是layer number号+opcode开始的。实际上opcode也是可以分解的。


我们补充下关于opcode的知识:
             layer:description
4 block cleanout
5 transaction management
10 index operations
11 row operations
13 segment management
14 extent management
17 tablespace management
18 block image(hot backups)
19 direct loader
20 compatibilityp segment
22 local managed tablespaces
23 block writes
24 ddl statsements
例如11.2,那么就可以分解为11+2也就是说明layer number是11,也就是row operationo layer为11的也是我们遇到的最多的,我再补充一点:
op  code    description
11.2 Insert Row Piece
11.3 Drop Row Piece
11.4 Lock Row Piece
11.5 Update Row Piece
11.6 Overflow Row Piece
11.11 Insert Row Array
11.12 Delete Row Array













阅读(2167) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~