Oracle数据块格式有哪几部分
本篇内容主要讲解“Oracle数据块格式有哪几部分”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Oracle数据块格式有哪几部分”吧!
数据块结构
Oracle 数据块有三部分:
Cache layer
Transaction layer
Data layer
Oracle Data Block的结构简图如下,其中从Data header到Row Data部分合称Data Layer:
---------------------
- Cache Layer -
---------------------
- Transaction Layer -
---------------------
- Data Header -
---------------------
- Table Directory -
---------------------
- Row Directory -
---------------------
- Free Space -
---------------------
- Row Data -
---------------------
- Tailchk -
---------------------
下面将使用bbed工具来显示相关结构信息
BBED>mapFile:/u01/app/oracle/oradata/shardcat/users01.dbf(7)Block:135Dba:0x01c00087------------------------------------------------------------KTBDataBlock(Table/Cluster)structkcbh,20bytes@0structktbbh,72bytes@20structkdbh,14bytes@100structkdbt[1],4bytes@114sb2kdbr[8]@118ub1freespace[7983]@134ub1rowdata[71]@8117ub4tailchk@8188
数据块组件
Oracle数据块三层C结构,它被映射到SGA kcbh(内核缓存数据块头)中的数据块。Cache Layer包含关于块格式,类型(数据,索引,头等)信息和序列数据。
BBED>pkcbhstructkcbh,20bytes@0ub1type_kcbh@00x06ub1frmt_kcbh@10xa2ub2wrp2_kcbh@20x0000ub4rdba_kcbh@40x01c00087ub4bas_kcbh@80x01286184ub2wrp_kcbh@120x0000ub1seq_kcbh@140x01ub1flg_kcbh@150x06(KCBHFDLC,KCBHFCKV)ub2chkval_kcbh@160x0137ub2spare3_kcbh@180x0000
Cache Layer:Block的第一部分,长度为20字节,内部数据结构名为kcbh,包括
type_kcbh:块类型(table/index,rollback segment,temporary segment等)
frmt_kcbh:块格式(v6,v7,v8)
rdba_kcbh:块地址DBA
bas_kcbh/wrp_kcbh:SCN
seq_kcbh:块的序列号
flg_kcbh:块的标志
事务层存储了关于数据块的事务信息
Transaction Layer:内部结构名ktbbh。分成两部分,第一部分为固定长度,长度为24字节,包含事务相关的一些基本信息。第二部分为可变长度,包含itl,长度根据itl条目的个数变化,每个itl长度为24字节,内部结构名ktbbhitl
BBED>pktbbhstructktbbh,72bytes@20ub1ktbbhtyp@200x01(KDDBTDATA)unionktbbhsid,4bytes@24ub4ktbbhsg1@240x0001af27ub4ktbbhod1@240x0001af27structktbbhcsc,8bytes@28ub4kscnbas@280x01286182ub2kscnwrp@320x8000ub2kscnwrp2@340x0000sb2ktbbhict@367938ub1ktbbhflg@380x32(NONE)ub1ktbbhfsl@390x00ub4ktbbhfnx@400x01c00080structktbbhitl[0],24bytes@44structktbitxid,8bytes@44ub2kxidusn@440x0006ub2kxidslt@460x0012ub4kxidsqn@480x000038f6structktbituba,8bytes@52ub4kubadba@520x010002d9ub2kubaseq@560x10c9ub1kubarec@580x09ub2ktbitflg@600x8000(KTBFCOM)union_ktbitun,2bytes@62sb2_ktbitfsc@62-32768ub2_ktbitwrp@620x8000ub4ktbitbas@640x01228dbbstructktbbhitl[1],24bytes@68structktbitxid,8bytes@68ub2kxidusn@680x0008ub2kxidslt@700x001bub4kxidsqn@720x00003a9astructktbituba,8bytes@76ub4kubadba@760x010002b5ub2kubaseq@800x114fub1kubarec@820x20ub2ktbitflg@840x2001(KTBFUPB)union_ktbitun,2bytes@86sb2_ktbitfsc@8610ub2_ktbitwrp@860x000aub4ktbitbas@880x01286184
这种结构出现在数据库每个数据块的开头部分。它甚至出现在不由redo改变的排序块中。它也会出现在数据文件头块和控制文件头块的开头部分。缓存层提供了对坏数据的规模。它也用来确保正确的数据块被读取并且数据块没有破裂或损坏。所谓破裂的数据块就是只有一部分被写入磁盘,数据块的一部分保留了之前的版本。
Data Layer:包括Data Header,Table Directory,Row Directory,Free Space和Row Data。
Data Header:长度14字节,内部数据结构名kdbh
BBED>pkdbhstructkdbh,14bytes@100ub1kdbhflag@1000x00(NONE)sb1kdbhntab@1011sb2kdbhnrow@1028sb2kdbhfrre@104-1sb2kdbhfsbo@10634sb2kdbhfseo@1088017sb2kdbhavsp@1107977sb2kdbhtosp@1127989
其中kdbhnrow是存储在数据块中的记录数为8,而表中确实有8条记录。(从ROWID可以判断出来)
SQL>selectdbms_rowid.rowid_block_number(rowid),t1.t_id,t1.t_namefromjy.t1;DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)T_IDT_NAME--------------------------------------------------------------------------------------1349YYL1351A1352B1353C1354D1355E1356F1357JYHY1358JYYYL9rowsselected.
Table Directory: 一般table只有一个条目,cluster则有一个或多个条目。每个条目长4字节,内部数据结构名kdbt
BBED>pkdbtstructkdbt[0],4bytes@114sb2kdbtoffs@1140sb2kdbtnrow@1168
Row Directory:数目由块中数据的行数决定,每个条目长2字节,内部数据结构名kdbr
BBED>pkdbrsb2kdbr[0]@1188080sb2kdbr[1]@1208072sb2kdbr[2]@1228064sb2kdbr[3]@1248056sb2kdbr[4]@1268048sb2kdbr[5]@1288040sb2kdbr[6]@1308029sb2kdbr[7]@1328017
查看表中的记录数据,一个重复计数也可以被指定用来重复执行examine命令来检查后续的行记录。下面的例子显示了先使用print命令来设置最后一行记录的偏移量,然后检查后面的8行记录的操作.
BBED>p*kdbr[7]rowdata[0]----------ub1rowdata[0]@81170x2cBBED>x/8rncrowdata[0]@8117----------flag@8117:0x2c(KDRHFL,KDRHFF,KDRHFH)lock@8118:0x02cols@8119:2col0[2]@8120:8col1[5]@8123:JYYYLrowdata[12]@8129-----------flag@8129:0x2c(KDRHFL,KDRHFF,KDRHFH)lock@8130:0x00cols@8131:2col0[2]@8132:7col1[4]@8135:JYHYrowdata[23]@8140-----------flag@8140:0x2c(KDRHFL,KDRHFF,KDRHFH)lock@8141:0x00cols@8142:2col0[2]@8143:6col1[1]@8146:Frowdata[31]@8148-----------flag@8148:0x2c(KDRHFL,KDRHFF,KDRHFH)lock@8149:0x00cols@8150:2col0[2]@8151:5col1[1]@8154:Erowdata[39]@8156-----------flag@8156:0x2c(KDRHFL,KDRHFF,KDRHFH)lock@8157:0x00cols@8158:2col0[2]@8159:4col1[1]@8162:Drowdata[47]@8164-----------flag@8164:0x2c(KDRHFL,KDRHFF,KDRHFH)lock@8165:0x00cols@8166:2col0[2]@8167:3col1[1]@8170:Crowdata[55]@8172-----------flag@8172:0x2c(KDRHFL,KDRHFF,KDRHFH)lock@8173:0x00cols@8174:2col0[2]@8175:2col1[1]@8178:Browdata[63]@8180-----------flag@8180:0x2c(KDRHFL,KDRHFF,KDRHFH)lock@8181:0x00cols@8182:2col0[2]@8183:1col1[1]@8186:A
Free Space:表示数据块中可用空间,内部数据结构名freespace
Row Data:表示实际的数据,内部数据结构名rowdata
BBED>prowdata[0]ub1rowdata[0]@81170x2cBBED>d/voffset8117File:/u01/app/oracle/oradata/shardcat/users01.dbf(7)Block:135Offsets:8117to8191Dba:0x01c00087-------------------------------------------------------2c020202c109054a5959594c2c000202l,......JYYYL,...c108044a5948592c000202c10701462cl...JYHY,......F,000202c10601452c000202c10501442cl......E,......D,000202c10401432c000202c10301422cl......C,......B,000202c102014101068461l......A...a<16bytesperline>
Tailchk:保存在块结尾用于校验的数据,长度4个字节,内部结构名tailchk。所有Oracle块的最后四个字节都是tail check(结尾检查)。
对于一个Oracle 8以上版本的数据块的tail它是由SCN base的低位两字节的内容,数据块的类型与SCN序列号组成的。例如,如果SCN base为 0x01286184,数据块类型为0x06,SCN序列号为0x01,那么tail check将是0x61840601
BBED>ptailchkub4tailchk@81880x61840601BBED>pkcbhstructkcbh,20bytes@0ub1type_kcbh@00x06ub1frmt_kcbh@10xa2ub2wrp2_kcbh@20x0000ub4rdba_kcbh@40x01c00087ub4bas_kcbh@80x01286184ub2wrp_kcbh@120x0000ub1seq_kcbh@140x01ub1flg_kcbh@150x06(KCBHFDLC,KCBHFCKV)ub2chkval_kcbh@160x0137ub2spare3_kcbh@180x0000
虽然tail check的值通常是由这三个组件级成,Oracle会对最终的值作为一个值(4字节)以单无符号整数来存储。在小字节序编码(little-endian)的构架机器中,比如Intel,这个值将以低位字节优先的方式来存储。因此如果使用标准块编辑器或dump命令来检查数据块的tail check时,字节顺序可能不一样。一个tail check为0x61840601,在Intel机器上它将以"01068461"的形式存储在磁盘。
BBED>dump/voffset8188File:/u01/app/oracle/oradata/shardcat/users01.dbf(7)Block:135Offsets:8188to8191Dba:0x01c00087-------------------------------------------------------01068461l...a<16bytesperline>
到此,相信大家对“Oracle数据块格式有哪几部分”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。