Oracle数据块主要有两种:文件头块和数据块。
下面先介绍数据块:
数据块简单分为下面几层:
BBED> set dba 1,58914 DBA 0x0040e622 (4253218 1,58914) BBED> map File: /u01/app/oracle/oradata/qxptfh01/system01.dbf (1) Block: 58914 Dba:0x0040e622 ------------------------------------------------------------ KTB Data Block (Table/Cluster) struct kcbh, 20 bytes @0 -- - Cache Layer - struct ktbbh, 72 bytes @20 --- Transaction Layer - struct kdbh, 14 bytes @92 -- Data Header - struct kdbt[1], 4 bytes @106 -- Table Directory - sb2 kdbr[3] @110 - Row Directory - ub1 freespace[8041] @116 - Free Space - ub1 rowdata[31] @8157 - Row Data - ub4 tailchk @8188 -- Tailchk -
从Data header到Row Data部分合称Data Layer。
Cache Layer:Block的第一部分,长度为20字节,内部数据结构名为kcbh,包括
下列几部分
BBED> p kcbh struct kcbh, 20 bytes @0 ub1 type_kcbh @0 0x06 --块类型(table/index,rollback segment,temporary segment等) ub1 frmt_kcbh @1 0xa2 --块格式(v6,v7,v8) ub1 spare1_kcbh @2 0x00 --保留 ub1 spare2_kcbh @3 0x00 --保留 ub4 rdba_kcbh @4 0x0040e622 --块地址DBA ub4 bas_kcbh @8 0x01a9b470 --scn base ub2 wrp_kcbh @12 0x0000 --scn wrap ub1 seq_kcbh @14 0x07 --块的序列号,设置为0xff,则认为是坏块。 ub1 flg_kcbh @15 0x06 (KCBHFDLC, KCBHFCKV) --块的标志,即块的属性。 ub2 chkval_kcbh @16 0x153c --校验值,db_block_checksum=true,才有值。 ub2 spare3_kcbh @18 0x0000 --保留
flg_kcbh:
define KCBHFNEW 0×01 /* new block - zeroed data area */
#define KCBHFDLC 0×02 /* Delayed Logging Change advance SCN/seq */
#define KCBHFCKV 0×04 /* ChecK Value saved-block xor’s to zero */
#define KCBHFTMP 0×08 /* Temporary block */
这是一个可以组合的值 也就是说有为 6 的时候是 2,4 两种情况的组合
type_kcbh:
Transaction Layer:内部结构名kcbbh。分成两部分:
第一部分为固定长度,长度为24字节,包含事务相关的一些基本信息。
第二部分为可变长度,包含itl,长度根据itl条目的个数变化,每个itl长度为24字节,内部结构名ktbbhitl。
BBED> p ktbbh struct ktbbh, 72 bytes @20 ub1 ktbbhtyp @20 0x01 (KDDBTDATA) --块类型。1为表,2为索引 union ktbbhsid, 4 bytes @24 --段或者对象的ID,也就是下边的0x00016f66转换为10进制就是 ub4 ktbbhsg1 @24 0x00016f66 --段号 ub4 ktbbhod1 @24 0x00016f66 --对象号 struct ktbbhcsc, 8 bytes @28 --最后一次块清除的SCNub4 kscnbas @28 0x01a9b461 --scn base ub2 kscnwrp @32 0x0000 --scn wrap b2 ktbbhict @36 2 --事务槽个数(ITL NUMBER) ub1 ktbbhflg @38 0x03 (KTBFONFL) --0 = ON THE FREELIST ub1 ktbbhfsl @39 0x00 --ITL TX FREELIST SLOT ub4 ktbbhfnx @40 0x00000000 --下一个空闲块的地址 dba struct ktbbhitl[0], 24 bytes @44 --事务槽1 struct ktbitxid, 8 bytes @44 --xid ub2 kxidusn @44 0x0007 --usn ub2 kxidslt @46 0x002d --slot ub4 kxidsqn @48 0x0000150a --seq struct ktbituba, 8 bytes @52 --uba ub4 kubadba @52 0x008008b0 --dba ub2 kubaseq @56 0x145d --seq ub1 kubarec @58 0x36 --ubarec ub2 ktbitflg @60 0x2003 (KTBFUPB) union _ktbitun, 2 bytes @62 b2 _ktbitfsc @62 0 ub2 _ktbitwrp @62 0x0000 ub4 ktbitbas @64 0x01a9b470 struct ktbbhitl[1], 24 bytes @68 --事务槽2 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 b2 _ktbitfsc @86 0 ub2 _ktbitwrp @86 0x0000 ub4 ktbitbas @88 0x00000000
下面通过ub4 ktbbhod1 @24 0x00016f66 查询对应的是哪个对象:
SQL> select to_number(‘00016f66‘,‘xxxxxxxx‘) from dual; TO_NUMBER(‘00016F66‘,‘XXXXXXXX‘) -------------------------------- 94054 SQL> col OBJECT_NAME FORMAT A15; SQL> COL OBJECT_TYPE FORMAT A15 SQL> select object_name,object_type from dba_objects where object_id=‘94054‘; OBJECT_NAME OBJECT_TYPE --------------- --------------- T1 TABLE
Data Layer:包括Data Header,Table Directory,Row Directory,Free Space和Row Data。其中
Data Header:长度14字节,内部数据结构名kdbh
BBED> p kdbh struct kdbh, 14 bytes @92 ub1 kdbhflag @92 0x00 (NONE) --标志位 (N:pctfree hit. F:do not put on freelist. K:flushable cluster keys) b1 kdbhntab @93 1 --表的个数 b2 kdbhnrow @94 3 --这个块的行数 sb2 kdbhfrre @96 -1 --是否在空闲列表。-1:不在空闲列表 sb2 kdbhfsbo @98 24 --空闲空间的开始offset sb2 kdbhfseo @100 8065 --空闲空间的结束offset b2 kdbhavsp @102 8041 --块的平均空间 b2 kdbhtosp @104 8041 --总共可以用的空间
Table Directory: 一般table只有一个条目,cluster则有一个或多个条目。每个条目长4字节,内部数据结构名kdbt。
BBED> p kdbt struct kdbt[0], 4 bytes @106 b2 kdbtoffs @106 0 b2 kdbtnrow @108 3
Row Directory:数目由块中数据的行数决定,每个条目长2字节,内部数据结构名kdbr
BBED> p kdbr sb2 kdbr[0] @110 8085 sb2 kdbr[1] @112 8075 sb2 kdbr[2] @114 8065
Free Space:表示数据块中可用空间,内部数据结构名freespace
Row Data:表示实际的数据,内部数据结构名rowdata
BBED> p freespace ub1 freespace[0] @116 0x00 ub1 freespace[1] @117 0x00 ub1 freespace[2] @118 0x00 ub1 freespace[3] @119 0x00 .........................................................
BBED> p rowdata ub1 rowdata[0] @8157 0x2c ub1 rowdata[1] @8158 0x01 ub1 rowdata[2] @8159 0x02 ub1 rowdata[3] @8160 0x02 ub1 rowdata[4] @8161 0xc1 ub1 rowdata[5] @8162 0x04 ub1 rowdata[6] @8163 0x03 ub1 rowdata[7] @8164 0x78 ub1 rowdata[8] @8165 0x6e
...........................................................................................
Tailchk:保存在块结尾用于校验的数据,长度4个字节,内部结构名tailchk。
tailchk=bas_kcbh最后两2字节(b470)+type_kcbh(06)+seq_kcbh(07).
BBED> p tailchk ub4 tailchk @8188 0xb4700607 --尾部校验码。
下面是文件头块信息:
BBED> set dba 1,1 DBA 0x00400001 (4194305 1,1) BBED> map File: /u01/app/oracle/oradata/qxptfh01/system01.dbf (1) Block: 1 Dba:0x00400001 ------------------------------------------------------------ Data File Header struct kcvfh, 676 bytes @0 ub4 tailchk @8188 BBED> p kcvfh struct kcvfh, 676 bytes @0 struct kcvfhbfh, 20 bytes @0 ub1 type_kcbh @0 0x0b -----数据的块类型 11可以看出是否是数据文件头 ub1 frmt_kcbh @1 0xa2 -----数据块的格式。1=oracle7 ,2=oracle8+ ub1 spare1_kcbh @2 0x00 ub1 spare2_kcbh @3 0x00 ub4 rdba_kcbh @4 0x00400001 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) ----块属性 ub2 chkval_kcbh @16 0x5064 ---检验值 ub2 spare3_kcbh @18 0x0000 struct kcvfhhdr, 76 bytes @20 ---此结构存储这个数据文件的属性 ub4 kccfhswv @20 0x00000000 ub4 kccfhcvn @24 0x0a200500 ---文件创建的版本号 ub4 kccfhdbi @28 0x783cfa8c ---数据库的DBID text kccfhdbn[0] @32 Q ---所属实例的名字 text kccfhdbn[1] @33 X text kccfhdbn[2] @34 P text kccfhdbn[3] @35 T text kccfhdbn[4] @36 F text kccfhdbn[5] @37 H text kccfhdbn[6] @38 0 text kccfhdbn[7] @39 1 ub4 kccfhcsq @40 0x00003db5 ---控制序列,控制文件事务会增加此值 ub4 kccfhfsz @44 0x0000f000 ---文件当前所包含数据块的个数 s_blkz kccfhbsz @48 0x00 ---文件存放的块大小,关闭数据库有值 ub2 kccfhfno @52 0x0001 ---文件号 ub2 kccfhtyp @54 0x0003 ---文件类型,03代表数据文件,06表示undo文件 ub4 kccfhacid @56 0x00000000 ---活动ID ub4 kccfhcks @60 0x00000000 ---创建检查点的SCN 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 0x00400179 ---ROOT DBA struct kcvfhcrs, 8 bytes @100 ---文件创建的SCN ub4 kscnbas @100 0x00000007 ---SCN BASE ub2 kscnwrp @104 0x0000 ---SCN WRAP ub4 kcvfhcrt @108 0x2ab9923a ---文件创建的时间戳 ub4 kcvfhrlc @112 0x30f3d1cf ---resetlogs的次数 struct kcvfhrls, 8 bytes @116 ---resetlogs的SCN ub4 kscnbas @116 0x0005eca9 ---SCN BASE ub2 kscnwrp @120 0x0000 ---SCN WRAP ub4 kcvfhbti @124 0x00000000 struct kcvfhbsc, 8 bytes @128 ---备份的SCN ub4 kscnbas @128 0x00000000 ---SCN BASE ub2 kscnwrp @132 0x0000 ---SCN WRAP ub2 kcvfhbth @136 0x0000 ub2 kcvfhsta @138 0x2004 (KCVFHOFZ) ---数据文件状态:04为正常,00为关闭,01为begin backup struct kcvfhckp, 36 bytes @484 ---检查点checkpoint struct kcvcpscn, 8 bytes @484 ---数据文件改变的检查点SCN ub4 kscnbas @484 0x01a947ff --SCN BASE ub2 kscnwrp @488 0x0000 --SCN WRAP ub4 kcvcptim @492 0x338a07e7 --最后改变的时间 ub2 kcvcpthr @496 0x0001 --resetlogs的线程号 union u, 12 bytes @500 struct kcvcprba, 12 bytes @500 ub4 kcrbaseq @500 0x000005a0 --序列号 ub4 kcrbabno @504 0x00000002 --块号 ub2 kcrbabof @508 0x0010 --偏移量offset 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 0x00000619 --数据文件发生checkpoint的次数 ub4 kcvfhrts @144 0x3348a98a --resetlogs的次数 ub4 kcvfhccc @148 0x00000618 --控制文件记录的检查点次数 struct kcvfhbcp, 36 bytes @152 struct kcvcpscn, 8 bytes @152 ub4 kscnbas @152 0x00000000 ub2 kscnwrp @156 0x0000 ub4 kcvcptim @160 0x00000000 ub2 kcvcpthr @164 0x0000 union u, 12 bytes @168 struct kcvcprba, 12 bytes @168 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 ub4 space_kcvmxcd[0] @316 0x00000000 ub4 space_kcvmxcd[1] @320 0x00000000 ub4 space_kcvmxcd[2] @324 0x00000000 ub4 space_kcvmxcd[3] @328 0x00000000 word kcvfhtsn @332 0 --表空间号 ub2 kcvfhtln @336 0x0006 text kcvfhtnm[0] @338 S --表空间的名字,最长为30字符 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 --文件SCN ub4 kscnbas @372 0x00000000 --SCN BASE ub2 kscnwrp @376 0x0000 --SCN WRAP ub4 kcvfhrft @380 0x00000000 struct kcvfhafs, 8 bytes @384 --绝对文件号 ub4 kscnbas @384 0x00000000 --SCN BASE ub2 kscnwrp @388 0x0000 --SCN WRAP ub4 kcvfhbbc @392 0x00000000 ub4 kcvfhncb @396 0x00000000 ub4 kcvfhmcb @400 0x00000000 ub4 kcvfhlcb @404 0x00000000 ub4 kcvfhbcs @408 0x00000000 ub2 kcvfhofb @412 0x000a ub2 kcvfhnfb @414 0x000a ub4 kcvfhprc @416 0x2ab99238 --上个resetlogs的次数 struct kcvfhprs, 8 bytes @420 --上个resetlogs的SCN ub4 kscnbas @420 0x00000001 ub2 kscnwrp @424 0x0000 struct kcvfhprfs, 8 bytes @428 ub4 kscnbas @428 0x00000000 ub2 kscnwrp @432 0x0000 ub4 kcvfhtrt @444 0x00000000 BBED>
type_kcbh:数据的块类型