使用BBED帮助理解Oracle数据块结构

日期: 2010-10-27 作者:佚名 来源:TechTarget中国

  BBED是Oracle提供的块编辑器,借助BBED,可以帮助我们更好的理解Oracle的Block的结构。当然,反过来说,也只有更加理解块的结构,才能更好的利用BBED完成某些特殊情况下的灾难恢复。

  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的map命令,可以看到数据块内部的一些数据结构名:

  BBED> map
  File: /u01/oracle/oradata/dbmon/system.dbf (1)
  Block: 31729 Dba:0x00407bf1
  ————————————————————
  KTB Data Block (Table/Cluster)
  struct kcbh, 20 bytes @0
  struct ktbbh, 72 bytes @20
  struct kdbh, 14 bytes @92
  struct kdbt[1], 4 bytes @106
  sb2 kdbr[336] @110
  ub1 freespace[821] @782
  ub1 rowdata[6585] @1603
  ub4 tailchk @8188

  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(用于做recovery时排序)
  •   seq_kcbh:块的序列号(sequnce number)
  •   flg_kcbh:块的标志

  BBED> p kcbh
  struct kcbh, 20 bytes @0
  ub1 type_kcbh @0 0x06
  ub1 frmt_kcbh @1 0xa2
  ub1 spare1_kcbh @2 0x00
  ub1 spare2_kcbh @3 0x00
  ub4 rdba_kcbh @4 0x00407bf1
  ub4 bas_kcbh @8 0xd6449de8
  ub2 wrp_kcbh @12 0x0595
  ub1 seq_kcbh @14 0x03
  ub1 flg_kcbh @15 0x04 (KCBHFCKV)
  ub2 chkval_kcbh @16 0x9130
  ub2 spare3_kcbh @18 0x0000
  Transaction Layer:内部结构名kcbbh。分成两部分,第一部分为固定长度,长度为24字节,包含事务相关的一些基本信息。第二部分为可变长度,包含itl,长度根据itl条目的个数变化,每个itl长度为24字节,内部结构名ktbbhitl。

  BBED> p ktbbh
  struct ktbbh, 72 bytes @20
  ub1 ktbbhtyp @20 0x01 (KDDBTDATA)
  union ktbbhsid, 4 bytes @24
  ub4 ktbbhsg1 @24 0x000050fc
  ub4 ktbbhod1 @24 0x000050fc
  struct ktbbhcsc, 8 bytes @28
  ub4 kscnbas @28 0xd6449de7
  ub2 kscnwrp @32 0x0595
  b2 ktbbhict @36 2
  ub1 ktbbhflg @38 0x02 (NONE)
  ub1 ktbbhfsl @39 0x00
  ub4 ktbbhfnx @40 0x00000000
  struct ktbbhitl[0], 24 bytes @44
  struct ktbitxid, 8 bytes @44
  ub2 kxidusn @44 0x0008
  ub2 kxidslt @46 0x000c
  ub4 kxidsqn @48 0x0000e991
  struct ktbituba, 8 bytes @52
  ub4 kubadba @52 0x0080222e
  ub2 kubaseq @56 0x03a4
  ub1 kubarec @58 0x22
  ub2 ktbitflg @60 0x8000 (KTBFCOM)
  union _ktbitun, 2 bytes @62
  b2 _ktbitfsc @62 1429
  ub2 _ktbitwrp @62 0x0595
  ub4 ktbitbas @64 0xd6449de6
  struct ktbbhitl[1], 24 bytes @68
  struct ktbitxid, 8 bytes @68
  ub2 kxidusn @68 0x0008
  ub2 kxidslt @70 0x0015
  ub4 kxidsqn @72 0x0000e992
  struct ktbituba, 8 bytes @76
  ub4 kubadba @76 0x0080222e
  ub2 kubaseq @80 0x03a4
  ub1 kubarec @82 0x23
  ub2 ktbitflg @84 0x0001 (NONE)
  union _ktbitun, 2 bytes @86
  b2 _ktbitfsc @86 0
  ub2 _ktbitwrp @86 0x0000
  ub4 ktbitbas @88 0x00000000
  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)
  b1 kdbhntab @93 1
  b2 kdbhnrow @94 336
  sb2 kdbhfrre @96 -1
  sb2 kdbhfsbo @98 690
  sb2 kdbhfseo @100 1511
  b2 kdbhavsp @102 821
  b2 kdbhtosp @104 821
  Table Directory: 一般table只有一个条目,cluster则有一个或多个条目。每个条目长4字节,内部数据结构名kdbt。

  BBED> p kdbt
  struct kdbt[0], 4 bytes @106
  b2 kdbtoffs @106 0
  b2 kdbtnrow @108 336
  Row Directory:数目由块中数据的行数决定,每个条目长2字节,内部数据结构名kdbr

  BBED> p kdbr
  sb2 kdbr[0] @110 7998
  sb2 kdbr[1] @112 8017
  …
  sb2 kdbr[335] @780 1511
  Free Space:表示数据块中可用空间,内部数据结构名freespace

  Row Data:表示实际的数据,内部数据结构名rowdata

  Tailchk:保存在块结尾用于校验的数据,长度4个字节,内部结构名tailchk。

  BBED>p tailchk
  ub4 tailchk @8188 0x9de80603

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

作者

佚名
佚名

相关推荐