First Impression on BBED: explore block structure using map command

本文通过使用BBED工具的map命令展示Oracle数据库中一个数据块的具体结构,详细解释了从Block Header到Row Data各部分的作用及意义,为理解Oracle内部存储机制提供了帮助。

之前在Data Block Structure (Try to Understand)中通过dump文件来尝试去分析一个block的结构,结果费了半天劲,也没有得到一个很清晰的概念。发现BBED的map命令很好很强大,可以用来得到一个block的结构组织情况,

通过设置dba来得到一个block的结构,如下所示...


  
BBED > map / v dba 6 , 12
File : / u01 / app / oracle / oradata / orcl / small_tbs01.dbf ( 6 )
Block: 12 Dba: 0x0180000c
-- ----------------------------------------------------------
KTB Data Block ( Table / Cluster)

struct kcbh, 20 bytes @0
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
b2 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
b1 kdbhntab @101
b2 kdbhnrow @102
sb2 kdbhfrre @104
sb2 kdbhfsbo @106
sb2 kdbhfseo @108
b2 kdbhavsp @110
b2 kdbhtosp @112

struct kdbt [ 1 ] , 4 bytes @114
b2 kdbtoffs @114
b2 kdbtnrow @116

sb2 kdbr [ 1 ] @118

ub1 freespace [ 8056 ] @120

ub1 rowdata [ 12 ] @8176

ub4 tailchk @8188


BBED >

这里面的一系列的struct,可以参见如下介绍...


  
/////////////////////////////////////////////////////////////////////////////////////// /
//////////// Block Header Structure, 20 bytes //////////////////////////////////////////
struct kcbh, 20 bytes @ 0
ub1 type_kcbh @
0 -- Block Type
-- 01 - Undo segment header
-- 02 - Undo data block
-- 03 - Save undo header
-- 04 - Save undo data block
-- 05 - Data segment header
-- 06 - Trans data, KTB managed data block(with ITL)
-- 07 - Temp table data block (no ITL)
-- 08 - Sort key
-- 09 - Sort Run
-- 10 - Segment free list block
-- 11 - Data file header
ub1 frmt_kcbh @
1 -- Block Format 1 = Oracle7, 2 = Oracle8 +
ub1 spare1_kcbh @
2 -- Not used, filler field
ub1 spare2_kcbh @
3 -- Not used, filler field
ub4 rdba_kcbh @
4 -- RDBA ( 4 bytes) - Relative Data Block Address
ub4 bas_kcbh @
8 -- SCN Base ( 4 bytes)
ub2 wrp_kcbh @
12 -- SCN Wrap ( 2 bytes)
ub1 seq_kcbh @
14 -- Sequence Number, incremented for every change made to the block at the same SCN
ub1 flg_kcbh @
15 -- Flag:
-- 0x01 New Block
-- 0x02 Delayed Logging Chang advanced SCN / seq
-- 0x04 Check value saved - block XOR ' s to Zero
-- 0x08 Temporary block
ub2 chkval_kcbh @
16 -- Optional block checksum ( if DB_BLOCK_CHECKSUM = TRUE)
ub2 spare3_kcbh @
18 -- Not used, filler field

/////////////////////////////////////////////////////////////////////////////////////// //
///////// Transaction Fixed Header Structure, 72 Bytes ////////////////////////////////////
struct ktbbh, 72 bytes @ 20
ub1 ktbbhtyp @
20 -- Block type ( 1 = DATA, 2 = INDEX)
union ktbbhsid,
4 bytes @ 24 -- Segment / Object ID
struct ktbbhcsc, 8 bytes @ 28 -- SCN at last block cleanout
b2 ktbbhict @
36 -- Number of ITL slots
ub1 ktbbhflg @
38 -- 0 = on the freelist
ub1 ktbbhfsl @
39 -- ITL TX freelist slot
ub4 ktbbhfnx @
40 -- DBA of next block on the freelist
struct ktbbhitl[ 2 ], 48 bytes @ 44 -- ITL list index, each ITL takes up 24 bytes

//////////////////////////////////////////////////////////////////////////////////////////
/////////////// Data Header Structure, 14 bytes ////////////////////////////////////////// //
struct kdbh, 14 bytes @ 100
ub1 kdbhflag @
100 -- N = pctfree hit(clusters)
-- F = do not put on freelist
-- K = flushable cluster keys
b1 kdbhntab @
101 -- Number of tables ( > 1 in clusters)
b2 kdbhnrow @
102 -- Number of rows ( 2 bytes)
sb2 kdbhfrre @
104 -- First free row entry index; - 1 = you have to add one
sb2 kdbhfsbo @
106 -- Freespace begin offset
sb2 kdbhfseo @
108 -- Freespace end offset
b2 kdbhavsp @
110 -- Available space in the block
b2 kdbhtosp @
112 -- Total available space when all TXs commit

/////////////////////////////////////////////////////////////////////////////////////// /
///////////////////// Table Directory Entry Structure, 4 bytes ///////////////////////////
struct kdbt[ 1 ], 4 bytes @ 114
b2 kdbtoffs @
114
b2 kdbtnrow @
116

/////////////////////////////////////////////////////////////////////////////////////// /
////////////////// Row Directory ////////////////////////////////////////////////////// /
sb2 kdbr[ 1 ] @ 118


/////////////////////////////////////////////////////////////////////////////////////// /
/////////////// // Free Space ///////////////////////////////////////////////////////// //
ub1 freespace[ 8056 ] @ 120

///////////////////////////////////////////////////////////////////////////////////////
///////////////////// Row Data ///////////////////////////////////////////////////////// /
ub1 rowdata[ 12 ] @ 8176

//////////////////////////////////////////////////////////////////////////////////// //
///////////////////// Block Tail Check, 4 bytes /////////////////////////////////////// /
ub4 tailchk @ 8188 -- Lower order two bytes of SCN Base + Block Type + SCN Seq

转载于:https://www.cnblogs.com/fangwenyu/archive/2011/02/19/1958273.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值