查看: 911|回复: 0

[原创] BBED 解析 Oracle Block 内部结构

[复制链接]
论坛徽章:
21
娜美
日期:2017-06-26 15:18:15火眼金睛
日期:2018-04-30 22:00:00目光如炬
日期:2018-07-29 22:00:00火眼金睛
日期:2018-08-31 22:00:00目光如炬
日期:2018-09-02 22:00:00目光如炬
日期:2018-09-16 22:00:01火眼金睛
日期:2018-09-30 22:00:00目光如炬
日期:2018-10-14 22:00:00火眼金睛
日期:2018-11-30 22:00:01目光如炬
日期:2018-04-29 22:00:00
发表于 2018-12-23 10:46 | 显示全部楼层 |阅读模式
本帖最后由 sunyunyi 于 2018-12-24 09:28 编辑



                                    Oracle Block 内部结构

作者简介:
----------------------------------------------------------------------
@ 孙显鹏,海天起点oracle技术专家,十年从业经验
@ 精通oracle内部原理,擅长调优和解决疑难问题
@ 致力于帮助客户解决生产中的问题,提高生产效率。
@ 爱好:书法,周易,中医。微信:sunyunyi_sun
@ 易曰:精义入神,以致用也!
@ 调优乃燮理阴阳何其难也!
----------------------------------------------------------------------


BBED 说明:
beed :(如果想深入学习可以下载bbed操作文档),这里简单介绍bbed需要注意的地方:
命令 d offset 134 count 2
count 后面是字节数,一个字节8位,而一个十六进制字符使用4位表示,所以两位十六进制表示一个字节,如0x06表示一个字节。
修改block时也是以字节为单位,也就是最少一次修改一个字节,也就是两个十六进制。linux 一个字节的低四位在十六
进制的高位存储,高四位在十六进制的低四位存储,比如0x0809---正确的顺序为0908。其他系统依据字节顺序确定。
搞计算机修改二进制或者16进制要和修改10进制一样熟练才行,你看到十六进制要很熟悉,不然可能出错!

将这个说清楚,不然后面不好讲。

下面我们以10 号文件的135号块为例说明数据块内部的结构:

首先看看整个数据块结构:
BBED> map
File: /u01/app/oracle/oradata/primary/abmt01.dbf (10)  --文件绝对号=10
Block: 135 --块号   Dba:0x02800087--rdba号,前10位文件号,后22为block号,后面有介绍
------------------------------------------------------------
KTB Data Block (Table/Cluster)--表示块的类型,这里为DATA

     该列C语句结构                         起始偏移量
struct kcbh, 20 bytes                      @0         --20字节为cache层  

struct ktbbh, 96 bytes                     @20        --96字节为事务层,该块包含了3个itl,每个ITL为24字节

struct kdbh, 14 bytes                      @124       --从这里开始为数据层

struct kdbt[1], 4 bytes                    @138       --行数

sb2 kdbr[78]                               @142       --行偏移量

ub1 freespace[815]                         @298       --空闲列表

ub1 rowdata[7075]                          @1113      --用户数据

ub4 tailchk                                @8188      --最后四位为tailchk


下面逐个解析:

1: cache 层: (前20个字节)

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        0x02800087
   ub4 bas_kcbh                             @8        0x00c2ca2e
   ub2 wrp_kcbh                             @12       0x0000
   ub1 seq_kcbh                             @14       0x01
   ub1 flg_kcbh                             @15       0x04 (KCBHFCKV)
   ub2 chkval_kcbh                          @16       0x1826
   ub2 spare3_kcbh                          @18       0x0000

cache层的代码结构:
struct kcbh
{ub1 type_kcbh; /* Block type* /
ub1 frmt_kcbh; /* #define KCBH_FRMT8 2 */
ub1 spare1_kcbh;
ub1 spare2_kcbh;
krdba rdba_kcbh; /* relative DBA /
ub4 bas_kcbh; /* base of SCN */
ub2 wrp_kcbh; /* wrap of SCN */
ub1 seq_kcbh; /* sequence # of changes at same scn */
ub1 flg_kcbh;
ub2 chkval_kcbh;
};

具体值:
ub1 type_kcbh :type,1byte,0x06为trans data,0x0e:undo segment,0x02:undo data

ub1 frmt_kcbh :frmt,1byte,8i~9i 都是0x02 10.1.0 2k: 0x62 4k:0x82 8k:0xa2 16k:0xc2 logfile 0x22

ub1 spare1_kcbh 和 ub1 spare2_kcbh 没有使用

ub4 rdba_kcbh :rdba,4byte,数据块地址,转换成2进制,前10 bit 表示file id (所以一个表空间可以包含1023 datafile)后22 bit 表示的block id

scn : 6byte,ub4 bas_kcbh + ub2 wrp_kcbh

ub1 seq_kcbh: seq,1byte,相同的SCN下修改数据块的序列号,最大值为254,0表示没有改变,小于 oxff-1表示修改序列号,oxff=255 表示坏块

ub1 flg_kcbh:flg:标志位,1byte,可能混合使用,6=0x02+0x04
as defined in kcbh.h
#define KCBHFNEW 0x01 /* new block - zeroed data area */
#define KCBHFDLC 0x02 /* Delayed Logging Change advance SCN/seq */
#define KCBHFCKV 0x04 /* Check Value saved-block xor's to zero */
#define KCBHFTMP 0x08 /* Temporary block */

ub2 chkval_kcbh:两字节,checksum值
ub2 spare3_kcbh:没有用

对应的block dump值:
Block dump from disk:
buffer tsn: 9 rdba: 0x02800087 (10/135)
scn: 0x0000.00c2ca2e seq: 0x01 flg: 0x04 tail: 0xca2e0601
frmt: 0x02 chkval: 0x1826 type: 0x06=trans data

tail: 0xca2e0601: 对于如下

BBED> p tailchk
ub4 tailchk                                 @8188     0xca2e0601

第 1 byte : 对应开始的 seq
第 2 byte : 对应开始的 type
第3,4byte : 对应开始的scn的末2为 control file 这里是control seq





2:事务层:

BBED> p ktbbh
struct ktbbh, 96 bytes                      @20      
   ub1 ktbbhtyp                             @20       0x01 (KDDBTDATA)
   union ktbbhsid, 4 bytes                  @24      
      ub4 ktbbhsg1                          @24       0x00013025
      ub4 ktbbhod1                          @24       0x00013025
   struct ktbbhcsc, 8 bytes                 @28      
      ub4 kscnbas                           @28       0x00c2ca23
      ub2 kscnwrp                           @32       0x0000
   sb2 ktbbhict                             @36       3
   ub1 ktbbhflg                             @38       0x32 (NONE)
   ub1 ktbbhfsl                             @39       0x00
   ub4 ktbbhfnx                             @40       0x02800080
   struct ktbbhitl[0], 24 bytes             @44      
      struct ktbitxid, 8 bytes              @44      
         ub2 kxidusn                        @44       0xffff
         ub2 kxidslt                        @46       0x0000
         ub4 kxidsqn                        @48       0x00000000
      struct ktbituba, 8 bytes              @52      
         ub4 kubadba                        @52       0x00000000
         ub2 kubaseq                        @56       0x0000
         ub1 kubarec                        @58       0x00
      ub2 ktbitflg                          @60       0x8000 (KTBFCOM)
      union _ktbitun, 2 bytes               @62      
         sb2 _ktbitfsc                      @62       0
         ub2 _ktbitwrp                      @62       0x0000
      ub4 ktbitbas                          @64       0x00c2ca23
   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
   struct ktbbhitl[2], 24 bytes             @92      
      struct ktbitxid, 8 bytes              @92      
         ub2 kxidusn                        @92       0x0000
         ub2 kxidslt                        @94       0x0000
         ub4 kxidsqn                        @96       0x00000000
      struct ktbituba, 8 bytes              @100     
         ub4 kubadba                        @100      0x00000000
         ub2 kubaseq                        @104      0x0000
         ub1 kubarec                        @106      0x00
      ub2 ktbitflg                          @108      0x0000 (NONE)
      union _ktbitun, 2 bytes               @110     
         sb2 _ktbitfsc                      @110      0
         ub2 _ktbitwrp                      @110      0x0000
      ub4 ktbitbas                          @112      0x00000000


ub1 ktbbhtyp : type 1 字节,1 data,2 index

union ktbbhsid:
4个字节,对应dump的 seg/obj: 0x13025:
union ktbbhsid, 4 bytes                     @24      
      ub4 ktbbhsg1                          @24       0x00013025
      ub4 ktbbhod1                          @24       0x00013025


SCN of the last block cleanout (csc):
struct ktbbhcsc, 8 bytes                 @28      
      ub4 kscnbas                           @28       0x00c2ca23
      ub2 kscnwrp                           @32       0x0000

sb2 ktbbhict                               @36       3            --itc: 3
   ub1 ktbbhflg                             @38       0x32 (NONE)  --flg: E
   ub1 ktbbhfsl                             @39       0x00         --
   ub4 ktbbhfnx                             @40       0x02800080   --bdba: 0x2800080

对应的dump 值:
Block header dump:  0x02800087
Object id on Block? Y
seg/obj: 0x13025  csc: 0x00.c2ca23  itc: 3  flg: E  typ: 1 - DATA
     brn: 0  bdba: 0x2800080 ver: 0x01 opc: 0
     inc: 0  exflg: 0

表示3个ITL:
struct ktbbhitl[0], 24 bytes
struct ktbbhitl[1], 24 bytes
struct ktbbhitl[2], 24 bytes

ITL描述如下:
An ITL descriptor (structure of 24 bytes) contains the following information:
1: Identifier of the transaction owning the ITL, composed of three items:
   usn#.slot#.wrap#
2: Undo block address (UBA) of the record in the undo segment: DBA.seq#.rec#
   Number of locks held by the transaction in the block
3: If the transaction has been committed, the SCN of the transaction
4: If the transaction has not been committed, the free space credits owned by this
   transaction (if any)

block 的ITL dump 信息如下:
Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0xffff.000.00000000  0x00000000.0000.00  C---    0  scn 0x0000.00c2ca23
0x02   0x0000.000.00000000  0x00000000.0000.00  ----    0  fsc 0x0000.00000000
0x03   0x0000.000.00000000  0x00000000.0000.00  ----    0  fsc 0x0000.00000000
bdba: 0x02800087

解析每个ITL 信息:

struct ktbbhitl[0], 24 bytes                @44      
      struct ktbitxid, 8 bytes              @44                            XID=0xffff.000.00000000
         ub2 kxidusn                        @44       0xffff
         ub2 kxidslt                        @46       0x0000
         ub4 kxidsqn                        @48       0x00000000
      struct ktbituba, 8 bytes              @52                            Uba=0x00000000.0000.00           
         ub4 kubadba                        @52       0x00000000
         ub2 kubaseq                        @56       0x0000
         ub1 kubarec                        @58       0x00
      ub2 ktbitflg                          @60       0x8000 (KTBFCOM)     Flag=C---,表示事务已经提交,如果手动提交事务可以修改该值,异常恢复使用!比如系统对象问题!
      union _ktbitun, 2 bytes               @62      
         sb2 _ktbitfsc                      @62       0
         ub2 _ktbitwrp                      @62       0x0000            
      ub4 ktbitbas                          @64       0x00c2ca23           scn= 0x0000.00c2ca23  

Scn/Fsc 具体含义:
If the transaction has been cleaned out, this is the commit SCN or an upper bound thereof.
Otherwise the leading two bytes contain the free space credit for the transaction - that is, the number of bytes freed in the block by the transaction
Scn = SCN of commited TX; Fsc = Free space credit (bytes)



3:数据层:

BBED> p kdbh
struct kdbh, 14 bytes                       @124     
   ub1 kdbhflag                             @124      0x00 (NONE)
   sb1 kdbhntab                             @125      1
   sb2 kdbhnrow                             @126      78
   sb2 kdbhfrre                             @128     -1
   sb2 kdbhfsbo                             @130      174
   sb2 kdbhfseo                             @132      989
   sb2 kdbhavsp                             @134      815
   sb2 kdbhtosp                             @136      815


ub1 kdbhflag:
N=pctfree hit(clusters), F=don't put on free list
K=flushable cluster keys.

sb1 kdbhntab:
block中有几个table的数据 cluster可能大于1

sb2 kdbhnrow:
block 有多少行数据

sb2 kdbhfrre:
First free row index entry. -1=you have to add one.

sb2 kdbhfsbo:
Free Space Begin offset

sb2 kdbhfseo:
Free Space End offset ,参与db_block_checking

sb2 kdbhavsp:
Available space in the block (pctfree and pctused)

sb2 kdbhtosp:
Total available space when all TXs commit,参与db_block_checking

结合block dump:
tsiz: 0x1f80
hsiz: 0xae
pbl: 0x7f68fa32427c
     76543210
flag=--------
ntab=1
nrow=78
frre=-1
fsbo=0xae
fseo=0x3dd
avsp=0x32f
tosp=0x32f



BBED> p kdbt
struct kdbt[0], 4 bytes                     @138     
   sb2 kdbtoffs                             @138      0
   sb2 kdbtnrow                             @140      78

sb2 kdbtoffs :
cluster table 使用
sb2 kdbtnrow :
这个table有多少行数据


用户的78行数据,偏移量:
sb2 kdbr[78]                               @142  
BBED> p kdbr
sb2 kdbr[0]                                 @142      7974
sb2 kdbr[1]                                 @144      7880
sb2 kdbr[2]                                 @146      7784
sb2 kdbr[3]                                 @148      7684
sb2 kdbr[4]                                 @150      7590
sb2 kdbr[5]                                 @152      7493
sb2 kdbr[6]                                 @154      7398
sb2 kdbr[7]                                 @156      7301
sb2 kdbr[8]                                 @158      7204
sb2 kdbr[9]                                 @160      7113
sb2 kdbr[10]                                @162      7018
sb2 kdbr[11]                                @164      6921
sb2 kdbr[12]                                @166      6822
sb2 kdbr[13]                                @168      6731
sb2 kdbr[14]                                @170      6633
sb2 kdbr[15]                                @172      6530
sb2 kdbr[16]                                @174      6427
sb2 kdbr[17]                                @176      6331
sb2 kdbr[18]                                @178      6239
sb2 kdbr[19]                                @180      6142
sb2 kdbr[20]                                @182      6045
sb2 kdbr[21]                                @184      5949
sb2 kdbr[22]                                @186      5858
sb2 kdbr[23]                                @188      5765
sb2 kdbr[24]                                @190      5665
sb2 kdbr[25]                                @192      5569
sb2 kdbr[26]                                @194      5468
sb2 kdbr[27]                                @196      5365
sb2 kdbr[28]                                @198      5279
sb2 kdbr[29]                                @200      5193
sb2 kdbr[30]                                @202      5112
sb2 kdbr[31]                                @204      5032
sb2 kdbr[32]                                @206      4951
sb2 kdbr[33]                                @208      4857
sb2 kdbr[34]                                @210      4761
sb2 kdbr[35]                                @212      4665
sb2 kdbr[36]                                @214      4572
sb2 kdbr[37]                                @216      4477
sb2 kdbr[38]                                @218      4382
sb2 kdbr[39]                                @220      4287
sb2 kdbr[40]                                @222      4190
sb2 kdbr[41]                                @224      4093
sb2 kdbr[42]                                @226      4006
sb2 kdbr[43]                                @228      3928
sb2 kdbr[44]                                @230      3849
sb2 kdbr[45]                                @232      3769
sb2 kdbr[46]                                @234      3688
sb2 kdbr[47]                                @236      3606
sb2 kdbr[48]                                @238      3524
sb2 kdbr[49]                                @240      3441
sb2 kdbr[50]                                @242      3359
sb2 kdbr[51]                                @244      3276
sb2 kdbr[52]                                @246      3198
sb2 kdbr[53]                                @248      3100
sb2 kdbr[54]                                @250      3003
sb2 kdbr[55]                                @252      2905
sb2 kdbr[56]                                @254      2808
sb2 kdbr[57]                                @256      2730
sb2 kdbr[58]                                @258      2651
sb2 kdbr[59]                                @260      2571
sb2 kdbr[60]                                @262      2490
sb2 kdbr[61]                                @264      2408
sb2 kdbr[62]                                @266      2326
sb2 kdbr[63]                                @268      2228
sb2 kdbr[64]                                @270      2131
sb2 kdbr[65]                                @272      2033
sb2 kdbr[66]                                @274      1936
sb2 kdbr[67]                                @276      1854
sb2 kdbr[68]                                @278      1773
sb2 kdbr[69]                                @280      1695
sb2 kdbr[70]                                @282      1614
sb2 kdbr[71]                                @284      1529
sb2 kdbr[72]                                @286      1442
sb2 kdbr[73]                                @288      1352
sb2 kdbr[74]                                @290      1258
sb2 kdbr[75]                                @292      1164
sb2 kdbr[76]                                @294      1078
sb2 kdbr[77]                                @296      989

对应的dump值:

0xeti[0]      nrow=78 offs=0
0x12ri[0]     offs=0x1f26====7947
0x14ri[1]     offs=0x1ec8
0x16ri[2]     offs=0x1e68
0x18ri[3]     offs=0x1e04
0x1ari[4]     offs=0x1da6
0x1cri[5]     offs=0x1d45
0x1eri[6]     offs=0x1ce6
0x20ri[7]     offs=0x1c85
0x22ri[8]     offs=0x1c24
0x24:pri[9]     offs=0x1bc9
0x26:pri[10]    offs=0x1b6a
0x28:pri[11]    offs=0x1b09
0x2a:pri[12]    offs=0x1aa6
0x2c:pri[13]    offs=0x1a4b
0x2e:pri[14]    offs=0x19e9
0x30:pri[15]    offs=0x1982
0x32:pri[16]    offs=0x191b
0x34:pri[17]    offs=0x18bb
0x36:pri[18]    offs=0x185f
0x38:pri[19]    offs=0x17fe
0x3a:pri[20]    offs=0x179d
0x3c:pri[21]    offs=0x173d
0x3e:pri[22]    offs=0x16e2
0x40:pri[23]    offs=0x1685
0x42:pri[24]    offs=0x1621
0x44:pri[25]    offs=0x15c1
0x46:pri[26]    offs=0x155c
0x48:pri[27]    offs=0x14f5
0x4a:pri[28]    offs=0x149f
0x4c:pri[29]    offs=0x1449
0x4e:pri[30]    offs=0x13f8
0x50:pri[31]    offs=0x13a8
0x52:pri[32]    offs=0x1357
0x54:pri[33]    offs=0x12f9
0x56:pri[34]    offs=0x1299
0x58:pri[35]    offs=0x1239
0x5a:pri[36]    offs=0x11dc
0x5c:pri[37]    offs=0x117d
0x5e:pri[38]    offs=0x111e
0x60:pri[39]    offs=0x10bf
0x62:pri[40]    offs=0x105e
0x64:pri[41]    offs=0xffd
0x66:pri[42]    offs=0xfa6
0x68:pri[43]    offs=0xf58
0x6a:pri[44]    offs=0xf09
0x6c:pri[45]    offs=0xeb9
0x6e:pri[46]    offs=0xe68
0x70:pri[47]    offs=0xe16
0x72:pri[48]    offs=0xdc4
0x74:pri[49]    offs=0xd71
0x76:pri[50]    offs=0xd1f
0x78:pri[51]    offs=0xccc
0x7a:pri[52]    offs=0xc7e
0x7c:pri[53]    offs=0xc1c
0x7e:pri[54]    offs=0xbbb
0x80:pri[55]    offs=0xb59
0x82:pri[56]    offs=0xaf8
0x84:pri[57]    offs=0xaaa
0x86:pri[58]    offs=0xa5b
0x88:pri[59]    offs=0xa0b
0x8a:pri[60]    offs=0x9ba
0x8c:pri[61]    offs=0x968
0x8e:pri[62]    offs=0x916
0x90:pri[63]    offs=0x8b4
0x92:pri[64]    offs=0x853
0x94:pri[65]    offs=0x7f1
0x96:pri[66]    offs=0x790
0x98:pri[67]    offs=0x73e
0x9a:pri[68]    offs=0x6ed
0x9c:pri[69]    offs=0x69f
0x9e:pri[70]    offs=0x64e
0xa0:pri[71]    offs=0x5f9
0xa2:pri[72]    offs=0x5a2
0xa4:pri[73]    offs=0x548
0xa6:pri[74]    offs=0x4ea
0xa8:pri[75]    offs=0x48c
0xaa:pri[76]    offs=0x436
0xac:pri[77]    offs=0x3dd



空闲空间:
BBED> p freespace
ub1 freespace[0]                            @298      0x00
ub1 freespace[1]                            @299      0x00
ub1 freespace[2]                            @300      0x00
ub1 freespace[3]                            @301      0x00
ub1 freespace[4]                            @302      0x00
ub1 freespace[5]                            @303      0x00
ub1 freespace[6]                            @304      0x00
ub1 freespace[7]                            @305      0x00
ub1 freespace[8]                            @306      0x00
ub1 freespace[9]                            @307      0x00
ub1 freespace[10]                           @308      0x00
ub1 freespace[11]                           @309      0x0
....

用户数据:

BBED> p rowdata
ub1 rowdata[0]                              @1113     0x2c
ub1 rowdata[1]                              @1114     0x00
ub1 rowdata[2]                              @1115     0x0e

前三个字节为:fb : lb : cc : 结合dump看
fb :        
K = Cluster Key (Flags may change meaning if this is set to show HASH cluster)
C = Cluster table member
H = Head piece of row
D = Deleted row
F = First data piece
L = Last data piece
P = First column continues from previous piece
N = Last column continues in next piece

lb :        和上面的 ITL 的lck相对应 表示这行是否被 lock 了

cc :        有几列数据 这里只能表示255列 超过了就会有链接行


后面为数据:

第一列:
ub1 rowdata[3]                              @1116     0x03--每一列开始表示列数据的长度,比如这里表示3个字节,下面为具体数据
ub1 rowdata[4]                              @1117     0x53
ub1 rowdata[5]                              @1118     0x59
ub1 rowdata[6]                              @1119     0x53

比如这里存储了'SYS' 这三个字符,具体的16进制dump值为 53,59,53 如下所示:

SQL> select dump('SYS',16) from dual;

DUMP('SYS',16)
------------------------------------------------------------------
Typ=96 Len=3: 53,59,53


第二列:
ub1 rowdata[7]                              @1120     0x0f--长度为15
ub1 rowdata[8]                              @1121     0x49
ub1 rowdata[9]                              @1122     0x5f
ub1 rowdata[10]                             @1123     0x58
ub1 rowdata[11]                             @1124     0x53
ub1 rowdata[12]                             @1125     0x24
ub1 rowdata[13]                             @1126     0x56
ub1 rowdata[14]                             @1127     0x45
ub1 rowdata[15]                             @1128     0x52
ub1 rowdata[16]                             @1129     0x49
ub1 rowdata[17]                             @1130     0x46
ub1 rowdata[18]                             @1131     0x49
ub1 rowdata[19]                             @1132     0x45
ub1 rowdata[20]                             @1133     0x52
ub1 rowdata[21]                             @1134     0x53
ub1 rowdata[22]                             @1135     0x31
第三列:
ub1 rowdata[23]                             @1136     0xff --空
第四列:
ub1 rowdata[24]                             @1137     0x03--长度为03
ub1 rowdata[25]                             @1138     0xc2
ub1 rowdata[26]                             @1139     0x05
ub1 rowdata[27]                             @1140     0x0a
第五列:
ub1 rowdata[28]                             @1141     0x03
ub1 rowdata[29]                             @1142     0xc2
ub1 rowdata[30]                             @1143     0x05
ub1 rowdata[31]                             @1144     0x0a
第六列:
ub1 rowdata[32]                             @1145     0x05
ub1 rowdata[33]                             @1146     0x49
ub1 rowdata[34]                             @1147     0x4e
ub1 rowdata[35]                             @1148     0x44
ub1 rowdata[36]                             @1149     0x45
ub1 rowdata[37]                             @1150     0x58
第七列:
ub1 rowdata[38]                             @1151     0x07
ub1 rowdata[39]                             @1152     0x78
ub1 rowdata[40]                             @1153     0x76
ub1 rowdata[41]                             @1154     0x07
ub1 rowdata[42]                             @1155     0x10
ub1 rowdata[43]                             @1156     0x02
ub1 rowdata[44]                             @1157     0x22
ub1 rowdata[45]                             @1158     0x04
第八列:
ub1 rowdata[46]                             @1159     0x07
ub1 rowdata[47]                             @1160     0x78
ub1 rowdata[48]                             @1161     0x76
ub1 rowdata[49]                             @1162     0x07
ub1 rowdata[50]                             @1163     0x10
ub1 rowdata[51]                             @1164     0x02
ub1 rowdata[52]                             @1165     0x22
ub1 rowdata[53]                             @1166     0x04
第九列:
ub1 rowdata[54]                             @1167     0x13
ub1 rowdata[55]                             @1168     0x32
ub1 rowdata[56]                             @1169     0x30
ub1 rowdata[57]                             @1170     0x31
ub1 rowdata[58]                             @1171     0x38
ub1 rowdata[59]                             @1172     0x2d
ub1 rowdata[60]                             @1173     0x30
ub1 rowdata[61]                             @1174     0x37
ub1 rowdata[62]                             @1175     0x2d
ub1 rowdata[63]                             @1176     0x31
ub1 rowdata[64]                             @1177     0x36
ub1 rowdata[65]                             @1178     0x3a
ub1 rowdata[66]                             @1179     0x30
ub1 rowdata[67]                             @1180     0x31
ub1 rowdata[68]                             @1181     0x3a
ub1 rowdata[69]                             @1182     0x33
ub1 rowdata[70]                             @1183     0x33
ub1 rowdata[71]                             @1184     0x3a
ub1 rowdata[72]                             @1185     0x30
ub1 rowdata[73]                             @1186     0x33
第十列:
ub1 rowdata[74]                             @1187     0x05
ub1 rowdata[75]                             @1188     0x56
ub1 rowdata[76]                             @1189     0x41
ub1 rowdata[77]                             @1190     0x4c
ub1 rowdata[78]                             @1191     0x49
ub1 rowdata[79]                             @1192     0x44
第十一列:
ub1 rowdata[80]                             @1193     0x01
ub1 rowdata[81]                             @1194     0x4e
第十二列:
ub1 rowdata[82]                             @1195     0x01
ub1 rowdata[83]                             @1196     0x4e
第十三列:
ub1 rowdata[84]                             @1197     0x01
ub1 rowdata[85]                             @1198     0x4e
第十四列:
ub1 rowdata[86]                             @1199     0x02
ub1 rowdata[87]                             @1200     0xc1
ub1 rowdata[88]                             @1201     0x05

首先存储第一行数据,第一行数据存储在数据块的最底层,相当于一个stack结构,
那么最上面也就是最后一行数据,该块存储了78行,从0到77,那么上面就是第77行
数据,对应的dump行数据为:可以逐个对照上面的数据!

tab 0, row 77, @0x3dd
tl: 89 fb: --H-FL-- lb: 0x0  cc: 14
col  0: [ 3]  53 59 53
col  1: [15]  49 5f 58 53 24 56 45 52 49 46 49 45 52 53 31
col  2: *NULL*
col  3: [ 3]  c2 05 0a
col  4: [ 3]  c2 05 0a
col  5: [ 5]  49 4e 44 45 58
col  6: [ 7]  78 76 07 10 02 22 04
col  7: [ 7]  78 76 07 10 02 22 04
col  8: [19]  32 30 31 38 2d 30 37 2d 31 36 3a 30 31 3a 33 33 3a 30 33
col  9: [ 5]  56 41 4c 49 44
col 10: [ 1]  4e
col 11: [ 1]  4e
col 12: [ 1]  4e
col 13: [ 2]  c1 05
end_of_block_dump



接下来为第二行:
ub1 rowdata[89]                             @1202     0x2c
ub1 rowdata[90]                             @1203     0x00
ub1 rowdata[91]                             @1204     0x0e

ub1 rowdata[92]                             @1205     0x03
ub1 rowdata[93]                             @1206     0x53
ub1 rowdata[94]                             @1207     0x59
ub1 rowdata[95]                             @1208     0x53

ub1 rowdata[96]                             @1209     0x0c
ub1 rowdata[97]                             @1210     0x58
ub1 rowdata[98]                             @1211     0x53
ub1 rowdata[99]                             @1212     0x24
ub1 rowdata[100]                            @1213     0x56
ub1 rowdata[101]                            @1214     0x45
ub1 rowdata[102]                            @1215     0x52
ub1 rowdata[103]                            @1216     0x49

后面不列出了

ub1 rowdata[7062]                           @8175     0x41
ub1 rowdata[7063]                           @8176     0x4c
ub1 rowdata[7064]                           @8177     0x49
ub1 rowdata[7065]                           @8178     0x44
ub1 rowdata[7066]                           @8179     0x01
ub1 rowdata[7067]                           @8180     0x4e
ub1 rowdata[7068]                           @8181     0x01
ub1 rowdata[7069]                           @8182     0x4e
ub1 rowdata[7070]                           @8183     0x01
ub1 rowdata[7071]                           @8184     0x4e
ub1 rowdata[7072]                           @8185     0x02
ub1 rowdata[7073]                           @8186     0xc1
ub1 rowdata[7074]                           @8187     0x05 ---最后的偏移量为@8187

最后面是taichk: 上面已经说明
BBED> p tailchk
ub4 tailchk                                 @8188     0xca2e0601

tailchk 占4字节,那么
8188+4=8192=8k ---就是这个8K的数据块

上面全面解析了ORACLE 数据块的内部结构



dd if=/u01/app/oracle/oradata/primary/abmt01.dbf bs=8k skip=135 count=1 |od -xv > block135.out

[oracle@piamarydb ~]$ more block135.out
0000000 a206 0000 0087 0280 ca2e 00c2 0000 0401
0000020 1826 0000 0001 0000 3025 0001 ca23 00c2
0000040 0000 0000 0003 0032 0080 0280 ffff 0000
0000060 0000 0000 0000 0000 0000 0000 8000 0000
0000100 ca23 00c2 0000 0000 0000 0000 0000 0000
0000120 0000 0000 0000 0000 0000 0000 0000 0000
0000140 0000 0000 0000 0000 0000 0000 0000 0000
0000160 0000 0000 0000 0000 0000 0000 0100 004e
0000200 ffff 00ae 03dd 032f 032f 0000 004e 1f26
0000220 1ec8 1e68 1e04 1da6 1d45 1ce6 1c85 1c24
0000240 1bc9 1b6a 1b09 1aa6 1a4b 19e9 1982 191b
0000260 18bb 185f 17fe 179d 173d 16e2 1685 1621
0000300 15c1 155c 14f5 149f 1449 13f8 13a8 1357
..................

od -An -w1 -tx1 testfile|awk '{for(i=1;i<=NF;++i){printf"%s",$i}}'

注意,第一列为偏移量,计算偏移量包含第一列,可以去掉第一列,如下所示,但是带上偏移量阅读更直观:

[oracle@piamarydb ~]$ dd if=/u01/app/oracle/oradata/primary/abmt01.dbf bs=8k skip=135 count=1 |od -xv -An > block135.out
1+0 records in
1+0 records out
8192 bytes (8.2 kB) copied, 0.00436298 s, 1.9 MB/s
[oracle@piamarydb ~]$ more block135.out
a206 0000 0087 0280 ca2e 00c2 0000 0401   --每一行从偏移量0到15,16个字节
1826 0000 0001 0000 3025 0001 ca23 00c2
0000 0000 0003 0032 0080 0280 ffff 0000
0000 0000 0000 0000 0000 0000 8000 0000
ca23 00c2 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0100 004e
ffff 00ae 03dd 032f 032f 0000 004e 1f26
1ec8 1e68 1e04 1da6 1d45 1ce6 1c85 1c24
1bc9 1b6a 1b09 1aa6 1a4b 19e9 1982 191b
18bb 185f 17fe 179d 173d 16e2 1685 1621
15c1 155c 14f5 149f 1449 13f8 13a8 1357
12f9 1299 1239 11dc 117d 111e 10bf 105e
0ffd 0fa6 0f58 0f09 0eb9 0e68 0e16 0dc4
0d71 0d1f 0ccc 0c7e 0c1c 0bbb 0b59 0af8
0aaa 0a5b 0a0b 09ba 0968 0916 08b4 0853
07f1 0790 073e 06ed 069f 064e 05f9 05a2
0548 04ea 048c 0436 03dd 0000 0000 0000

接下来可以定位偏移量解码该数据块!--有兴趣可以继续深入研究!!


孙显鹏
2018-11









您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会,7折限时优惠重磅来袭!
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。

限时七折期:2019年8月31日前


----------------------------------------

大会官网>>
TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 
京ICP备09055130号-4  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表