BBED中map命令能显示数据块的数据结构,本文以bbed分析数据块头及数据块为例,说明map中的具体结构。
1. 数据块头结构 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 BBED> set dba 1,1 DBA 0x00400001 (4194305 1,1) BBED> map /v File: /oradata/datafile/linora/system01.dbf (1) Block: 1 Dba:0x00400001 ------------------------------------------------------------ Data File Header --表示文件头 struct kcvfh, 860 bytes @0 --此块只有一个Structure,kcvfh struct kcvfhbfh, 20 bytes @0 struct kcvfhhdr, 76 bytes @20 ub4 kcvfhrdb @96 struct kcvfhcrs, 8 bytes @100 ub4 kcvfhcrt @108 ub4 kcvfhrlc @112 struct kcvfhrls, 8 bytes @116 ub4 kcvfhbti @124 struct kcvfhbsc, 8 bytes @128 ub2 kcvfhbth @136 ub2 kcvfhsta @138 struct kcvfhckp, 36 bytes @484 ub4 kcvfhcpc @140 ub4 kcvfhrts @144 ub4 kcvfhccc @148 struct kcvfhbcp, 36 bytes @152 ub4 kcvfhbhz @312 struct kcvfhxcd, 16 bytes @316 sword kcvfhtsn @332 ub2 kcvfhtln @336 text kcvfhtnm[30] @338 ub4 kcvfhrfn @368 struct kcvfhrfs, 8 bytes @372 ub4 kcvfhrft @380 struct kcvfhafs, 8 bytes @384 ub4 kcvfhbbc @392 ub4 kcvfhncb @396 ub4 kcvfhmcb @400 ub4 kcvfhlcb @404 ub4 kcvfhbcs @408 ub2 kcvfhofb @412 ub2 kcvfhnfb @414 ub4 kcvfhprc @416 struct kcvfhprs, 8 bytes @420 struct kcvfhprfs, 8 bytes @428 ub4 kcvfhtrt @444 ub4 tailchk @8188
print kcvfh看看具体内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 BBED> p kcvfh struct kcvfh, 860 bytes @0 struct kcvfhbfh, 20 bytes @0 --数据块头 --前20个字节对应如图一所示 ub1 type_kcbh @0 0x0b --Header Block Type,如图二 --此处转换为10进制是11,正是file header ub1 frmt_kcbh @1 0xa2 --块格式,1为Oracle 7,2为Oracle 8后 ub1 spare1_kcbh @2 0x00 ub1 spare2_kcbh @3 0x00 ub4 rdba_kcbh @4 0x00400001 --RDBA,相对块地址 ub4 bas_kcbh @8 0x00000000 --SCN base ub2 wrp_kcbh @12 0x0000 --SCN Wrap ub1 seq_kcbh @14 0x01 --序列号,同一个SCN不同的序列号,标记块版本 ub1 flg_kcbh @15 0x04 (KCBHFCKV) --标记号 --0x01新块 --0x02 Delayed Logging Chang advanced SCN/seq --0x04 Check value saved ub2 chkval_kcbh @16 0x1375 --块校验值 ub2 spare3_kcbh @18 0x0000 struct kcvfhhdr, 76 bytes @20 --文件头通用数据类型 ub4 kccfhswv @20 0x00000000 ub4 kccfhcvn @24 0x0b200400 ub4 kccfhdbi @28 0xc9cffd9d --dbid text kccfhdbn[0] @32 L --接下来8个字符为Oracle SID,只能<=8个字符 text kccfhdbn[1] @33 I text kccfhdbn[2] @34 N text kccfhdbn[3] @35 O text kccfhdbn[4] @36 R text kccfhdbn[5] @37 A text kccfhdbn[6] @38 text kccfhdbn[7] @39 ub4 kccfhcsq @40 0x00002353 --Controlfile sequence number ub4 kccfhfsz @44 0x00016800 --所在数据文件块数=dba_data_files.blocks s_blkz kccfhbsz @48 0x00 ub2 kccfhfno @52 0x0001 --文件号file_id ub2 kccfhtyp @54 0x0003 --文件类型,03表示数据文件,06表示undo ub4 kccfhacid @56 0x00000000 ub4 kccfhcks @60 0x00000000 text kccfhtag[0] @64 text kccfhtag[1] @65 text kccfhtag[2] @66 text kccfhtag[3] @67 text kccfhtag[4] @68 text kccfhtag[5] @69 text kccfhtag[6] @70 text kccfhtag[7] @71 text kccfhtag[8] @72 text kccfhtag[9] @73 text kccfhtag[10] @74 text kccfhtag[11] @75 text kccfhtag[12] @76 text kccfhtag[13] @77 text kccfhtag[14] @78 text kccfhtag[15] @79 text kccfhtag[16] @80 text kccfhtag[17] @81 text kccfhtag[18] @82 text kccfhtag[19] @83 text kccfhtag[20] @84 text kccfhtag[21] @85 text kccfhtag[22] @86 text kccfhtag[23] @87 text kccfhtag[24] @88 text kccfhtag[25] @89 text kccfhtag[26] @90 text kccfhtag[27] @91 text kccfhtag[28] @92 text kccfhtag[29] @93 text kccfhtag[30] @94 text kccfhtag[31] @95 ub4 kcvfhrdb @96 0x00400208 --仅1号文件有值,代表root dba,本例中转换为10进制为4194824, --通过dbms_utility可以查看到正是1号文件520 Block。 --在11g中,dba 1,520 代表的是bootstrap$,10g是dba 1,377,10g以前是dba 1,417 --查询语句: --col SEGMENT_NAME for a15 --select segment_name,segment_type,header_file,header_block from dba_segments where header_block=520; struct kcvfhcrs, 8 bytes @100 --数据文件创建scn ub4 kscnbas @100 0x0000000e ub2 kscnwrp @104 0x0000 ub4 kcvfhcrt @108 0x3201eb02 --数据文件创建时间 ub4 kcvfhrlc @112 0x32a6fb05 --resetlog时间 struct kcvfhrls, 8 bytes @116 --resetlog scn ub4 kscnbas @116 0x00170c23 ub2 kscnwrp @120 0x0000 ub4 kcvfhbti @124 0x00000000 --begin hot backup time struct kcvfhbsc, 8 bytes @128 --last backup stared scn ub4 kscnbas @128 0x00000000 ub2 kscnwrp @132 0x0000 ub2 kcvfhbth @136 0x0000 --begin hot backup redo thread ub2 kcvfhsta @138 0x2004 (KCVFHOFZ) --数据文件状态,04为正常,00为关闭,01为begin backup struct kcvfhckp, 36 bytes @484 --检查点信息 struct kcvcpscn, 8 bytes @484 --检查点scn ub4 kscnbas @484 0x003443f4 ub2 kscnwrp @488 0x0000 ub4 kcvcptim @492 0x331aa11c --检查点时间 ub2 kcvcpthr @496 0x0001 --检查点线程号 union u, 12 bytes @500 struct kcvcprba, 12 bytes @500 --Checkpoint scn redo rda(参照前文[重做日志]关于rba的描述) ub4 kcrbaseq @500 0x000000ae --log序列号 ub4 kcrbabno @504 0x00000002 --块号 ub2 kcrbabof @508 0x0010 --偏移量 ub1 kcvcpetb[0] @512 0x02 --最大线程数 ub1 kcvcpetb[1] @513 0x00 ub1 kcvcpetb[2] @514 0x00 ub1 kcvcpetb[3] @515 0x00 ub1 kcvcpetb[4] @516 0x00 ub1 kcvcpetb[5] @517 0x00 ub1 kcvcpetb[6] @518 0x00 ub1 kcvcpetb[7] @519 0x00 ub4 kcvfhcpc @140 0x00000253 --v$datafile_header.CHECKPOINT_COUNT,数据文件发生Checkpoint的次数 ub4 kcvfhrts @144 0x331aa119 --recoved time ub4 kcvfhccc @148 0x00000252 --控制文件检查点次数 struct kcvfhbcp, 36 bytes @152 --backup Checkpoint struct kcvcpscn, 8 bytes @152 --begin backup checkpoint scn ub4 kscnbas @152 0x00000000 ub2 kscnwrp @156 0x0000 ub4 kcvcptim @160 0x00000000 --begin backup checkpoint time ub2 kcvcpthr @164 0x0000 --begin backup checkpoint thread union u, 12 bytes @168 struct kcvcprba, 12 bytes @168 --begin backup checkpoint rba ub4 kcrbaseq @168 0x00000000 ub4 kcrbabno @172 0x00000000 ub2 kcrbabof @176 0x0000 ub1 kcvcpetb[0] @180 0x00 ub1 kcvcpetb[1] @181 0x00 ub1 kcvcpetb[2] @182 0x00 ub1 kcvcpetb[3] @183 0x00 ub1 kcvcpetb[4] @184 0x00 ub1 kcvcpetb[5] @185 0x00 ub1 kcvcpetb[6] @186 0x00 ub1 kcvcpetb[7] @187 0x00 ub4 kcvfhbhz @312 0x00000000 struct kcvfhxcd, 16 bytes @316 大专栏 BBED Structure ub4 space_kcvmxcd[0] @316 0x00000000 ub4 space_kcvmxcd[1] @320 0x00000000 ub4 space_kcvmxcd[2] @324 0x00000000 ub4 space_kcvmxcd[3] @328 0x00000000 sword kcvfhtsn @332 0 --表空间号:v$tablespace.ts$ ub2 kcvfhtln @336 0x0006 --表空间名字,最大为30字节 text kcvfhtnm[0] @338 S text kcvfhtnm[1] @339 Y text kcvfhtnm[2] @340 S text kcvfhtnm[3] @341 T text kcvfhtnm[4] @342 E text kcvfhtnm[5] @343 M text kcvfhtnm[6] @344 text kcvfhtnm[7] @345 text kcvfhtnm[8] @346 text kcvfhtnm[9] @347 text kcvfhtnm[10] @348 text kcvfhtnm[11] @349 text kcvfhtnm[12] @350 text kcvfhtnm[13] @351 text kcvfhtnm[14] @352 text kcvfhtnm[15] @353 text kcvfhtnm[16] @354 text kcvfhtnm[17] @355 text kcvfhtnm[18] @356 text kcvfhtnm[19] @357 text kcvfhtnm[20] @358 text kcvfhtnm[21] @359 text kcvfhtnm[22] @360 text kcvfhtnm[23] @361 text kcvfhtnm[24] @362 text kcvfhtnm[25] @363 text kcvfhtnm[26] @364 text kcvfhtnm[27] @365 text kcvfhtnm[28] @366 text kcvfhtnm[29] @367 ub4 kcvfhrfn @368 0x00000001 --相对文件号 struct kcvfhrfs, 8 bytes @372 --Recovery fuzzy scn ub4 kscnbas @372 0x00000000 ub2 kscnwrp @376 0x0000 ub4 kcvfhrft @380 0x00000000 --Recovery fuzzy time struct kcvfhafs, 8 bytes @384 --Absolute fuzzy scn ub4 kscnbas @384 0x00000000 ub2 kscnwrp @388 0x0000 ub4 kcvfhbbc @392 0x00000000 --Backup Block Count ub4 kcvfhncb @396 0x00000000 --marked media Corrupt Blocks ub4 kcvfhmcb @400 0x00000000 --Media Corrupt Blocks ub4 kcvfhlcb @404 0x00000000 --Logically Corrupt Blocks ub4 kcvfhbcs @408 0x00000000 --Backup Completion timeStamp ub2 kcvfhofb @412 0x000a ub2 kcvfhnfb @414 0x000a ub4 kcvfhprc @416 0x323c286e --prev reset logs time struct kcvfhprs, 8 bytes @420 --prev reset logs scn ub4 kscnbas @420 0x001084e6 ub2 kscnwrp @424 0x0000 struct kcvfhprfs, 8 bytes @428 ub4 kscnbas @428 0x00000000 ub2 kscnwrp @432 0x0000 ub4 kcvfhtrt @444 0x00000000 --Terminal Recovery Stamp
图1 Block Structure 图2 Header block type
2. 数据块结构 数据块的结构如图三所示,包括cache层,事务层和数据层。 图3 Data Block Structure
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 BBED> set dba 8,11477 DBA 0x02002cd5 (33565909 8,11477) BBED> map /v File: /oradata/datafile/linora/perf01.dbf (8) Block: 11477 Dba:0x02002cd5 ------------------------------------------------------------ KTB Data Block (Table/Cluster) --表示属于KTB数据块 struct kcbh, 20 bytes @0 --数据块头,其定义跟kcvfh一样 ub1 type_kcbh @0 ub1 frmt_kcbh @1 ub1 spare1_kcbh @2 ub1 spare2_kcbh @3 ub4 rdba_kcbh @4 ub4 bas_kcbh @8 ub2 wrp_kcbh @12 ub1 seq_kcbh @14 ub1 flg_kcbh @15 ub2 chkval_kcbh @16 ub2 spare3_kcbh @18 struct ktbbh, 72 bytes @20 --事务层 ub1 ktbbhtyp @20 union ktbbhsid, 4 bytes @24 struct ktbbhcsc, 8 bytes @28 sb2 ktbbhict @36 ub1 ktbbhflg @38 ub1 ktbbhfsl @39 ub4 ktbbhfnx @40 struct ktbbhitl[2], 48 bytes @44 struct kdbh, 14 bytes @100 --数据层 ub1 kdbhflag @100 sb1 kdbhntab @101 sb2 kdbhnrow @102 sb2 kdbhfrre @104 sb2 kdbhfsbo @106 sb2 kdbhfseo @108 sb2 kdbhavsp @110 sb2 kdbhtosp @112 struct kdbt[1], 4 bytes @114 --表目录层 sb2 kdbtoffs @114 sb2 kdbtnrow @116 sb2 kdbr[9] @118 --行目录层 ub1 freespace[7430] @136 --空闲空间 ub1 rowdata[622] @7566 --实际行数据 ub4 tailchk @8188
分别打印上述结构,看看具体内容(kcbh(block header structure)定义如kcvfh.kcvfhbfh一致,均为数据块头,此处不在赘述)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 BBED> p ktbbh struct ktbbh, 72 bytes @20 ub1 ktbbhtyp @20 0x01 (KDDBTDATA) --块类型,1为data,2为index union ktbbhsid, 4 bytes @24 --Segment/Object ID,如果两者一致,表示对象没有被Truncate过 ub4 ktbbhsg1 @24 0x00014b01 ub4 ktbbhod1 @24 0x00014b01 struct ktbbhcsc, 8 bytes @28 --块最后清除的SCN ub4 kscnbas @28 0x0021d786 ub2 kscnwrp @32 0x0000 sb2 ktbbhict @36 2 --ITL slot number,事务槽号 ub1 ktbbhflg @38 0x32 (NONE) --0=on the free list ub1 ktbbhfsl @39 0x00 --ITL free list slot ub4 ktbbhfnx @40 0x02002cd0 --DBA of next block on the freelist struct ktbbhitl[0], 24 bytes @44 --ITL list index struct ktbitxid, 8 bytes @44 --ITL xid ub2 kxidusn @44 0x0003 --usn ub2 kxidslt @46 0x000b --slot ub4 kxidsqn @48 0x0000050d --Sequence struct ktbituba, 8 bytes @52 --uba ub4 kubadba @52 0x00c006d4 ub2 kubaseq @56 0x00d2 ub1 kubarec @58 0x34 ub2 ktbitflg @60 0x2009 (KTBFUPB) union _ktbitun, 2 bytes @62 sb2 _ktbitfsc @62 0 ub2 _ktbitwrp @62 0x0000 ub4 ktbitbas @64 0x0021d795 struct ktbbhitl[1], 24 bytes @68 struct ktbitxid, 8 bytes @68 ub2 kxidusn @68 0x0000 ub2 kxidslt @70 0x0000 ub4 kxidsqn @72 0x00000000 struct ktbituba, 8 bytes @76 ub4 kubadba @76 0x00000000 ub2 kubaseq @80 0x0000 ub1 kubarec @82 0x00 ub2 ktbitflg @84 0x0000 (NONE) union _ktbitun, 2 bytes @86 sb2 _ktbitfsc @86 0 ub2 _ktbitwrp @86 0x0000 ub4 ktbitbas @88 0x00000000
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 BBED> p kdbh struct kdbh, 14 bytes @100 ub1 kdbhflag @100 0x00 (NONE) sb1 kdbhntab @101 1 --表的个数,clusters>1 sb2 kdbhnrow @102 9 --块中包含的行数 sb2 kdbhfrre @104 -1 --是否在空闲列表,-1表示不在空闲列表 sb2 kdbhfsbo @106 36 --freespace start offset sb2 kdbhfseo @108 7466 --freespace end offset sb2 kdbhavsp @110 7430 --块内可用空间 sb2 kdbhtosp @112 7430 --事务提交后所有的可用空间
2.3 kdbt(Table Directory Entry Structure) 1 2 3 4 BBED> p kdbt struct kdbt[0], 4 bytes @114 sb2 kdbtoffs @114 0 sb2 kdbtnrow @116 9
2.4 kdbr(Row Directory) kdbr代表行目录,后面的n是代表该块中存储了多少行数据记录,从第0行开始计算。下例中,表示该块中存储了9行数据。
1 2 3 4 5 6 7 8 9 10 BBED> p kdbr sb2 kdbr[0] @118 8015 sb2 kdbr[1] @120 7946 sb2 kdbr[2] @122 7876 sb2 kdbr[3] @124 7803 sb2 kdbr[4] @126 7744 sb2 kdbr[5] @128 7677 sb2 kdbr[6] @130 7612 sb2 kdbr[7] @132 7538 sb2 kdbr[8] @134 7466
结合*号可以打印此块中的第n行数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 BBED> p *kdbr[2] rowdata[410] ------------ ub1 rowdata[410] @7976 0x2c --2c代表正常为删除数据,3c代表标记为删除的数据行,第二列是该行数据的偏移量,第三列为标识符fb。 BBED> d /v File: /oradata/datafile/linora/perf01.dbf (8) Block: 11477 Offsets: 7976 to 8191 Dba:0x02002cd5 ------------------------------------------------------- 2c010b02 c203084a 414e6e69 66657206 l ,......JANnifer. 5768616c 656e074a 5748414c 454e0c35 l Whalen.JWHALEN.5 31352e31 32332e34 34343407 78670911 l 15.123.4444.xg.. 01010107 41445f41 53535402 c22dff03 l ....AD_ASST..-.. c2020202 c10b2c01 0b03c202 6407446f l ......,.....d.Do 75676c61 73054772 616e7406 44475241 l uglas.Grant.DGRA 4e540c36 35302e35 30372e39 38343407 l NT.650.507.9844. 786c010d 01010108 53485f43 4c45524b l xl......SH_CLERK 02c21bff 03c20219 02c1332c 010b03c2 l ..........3,.... 02630644 6f6e616c 64084f43 6f6e6e65 l .c.Donald.OConne 6c6c0844 4f434f4e 4e454c0c 3635302e l ll.DOCONNEL.650. 3530372e 39383333 07786b06 15010101 l 507.9833.xk..... 0853485f 434c4552 4b02c21b ff03c202 l .SH_CLERK....... 1902c133 010695d7 l ...3.... BBED> x /rncccctcnnnn rowdata[410] @7976 ------------ [email protected] : 0x2c (KDRHFL, KDRHFF, KDRHFH)[email protected] : 0x01[email protected] : 11col 0[2] @7979: 200 col 1[8] @7982: JANnifer col 2[6] @7991: Whalen col 3[7] @7998: JWHALEN col 4[12] @8006: 515.123.4444 col 5[7] @8019: 2003-09-17 00:00:00 col 6[7] @8027: AD_ASST col 7[2] @8035: 4400 col 8[0] @8038: *NULL* col 9[3] @8039: 101 col 10[2] @8043: 10
Reference:dissassembling_the_data_block