使用BBED了解数据块结构

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                         --最后一次块清除的SCN      
      ub4 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:数据的块类型

时间: 2024-10-14 17:33:29

使用BBED了解数据块结构的相关文章

通过bbed了解数据块结构

首先我们有一个表为 SQL> select * from t2; ID NAME ---------- ---------------------------------------------------------------------------------------------------- 1 AAAAA 1 BBBBB 1 CCCCC 1 DDDDD 1 EEEEE 查询出每行的所在的dba SQL> select id,name,dbms_rowid.ROWID_RELATI

使用bbed编辑研究oracle数据块结构

bbed是随oracle软件发布的一款数据块查看和编辑工具,作为一款内部工具,bbed的功能非常强大,但是如果使用不当可能给数据库造成无法挽回的损失.因此.我们建议在使用bbed修改数据块前备份被修改的数据文件,并且在成功修复数据块后立即将数据库数据导出,并新建数据库. 编辑并使用bbed 首次使用bbed前必须要经过链接编译.编译方法如下: [[email protected] lib]$ make -f ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed Lin

Oracle 10g 数据文件的第一个数据块结构

一.数据文件的第一个数据块结构kcvfh BBED> set file 1 FILE# 1 BBED> set block 1 BLOCK# 1 --查看第一个数据块的整体结构 BBED> map /v File: /u01/app/oracle/oradata/ORCL/datafile/o1_mf_system_bc7ld3sf_.dbf (1) Block: 1 Dba:0x00400001 ---------------------------------------------

利用BBED恢复数据文件头

转载请注明出处:http://blog.csdn.net/guoyjoe/article/details/31018075 @@@@@@@利用BBED模拟损坏5文件1号块(文件头) BBED> copy file 4 block 4 to file 5 block 1 File: /u01/app/oracle/oradata/PROD/tp01.dbf (5) Block: 1 Offsets: 0 to 19 Dba:0x01400001 --------------------------

分享:bbed修改数据文件头推进scn与其他数据文件相同

场景简介: 物理copy表空间数据文件,数据库发生完全检查点,删除该表空间下的数据文件,使该表空间数据文件头的scn与其他数据文件不一致. 场景构造: 1.  创建测试表空间 [email protected]> create tablespace bbed datafile '/u01/app/oracle/oradata/orser/bbed01.dbf' size 10M autoextend on; Tablespace created 2.  物理cp数据文件(最好先做备份) [[em

使用bbed修改数据

bbed是一个强大的工具,允许我们绕过oracle直接从数据文件中修改对应的内容 [email protected]>select * from emp; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- -------------------- ------------------ ---------- ------------ ---------- ---------- ---------- 7499 ALLEN SALESMAN

使用BBED恢复数据文件头

转载请注明出处:http://blog.csdn.net/guoyjoe/article/details/31018075 @@@@@@@利用BBED模拟损坏5文件1号块(文件头) BBED> copy file 4 block 4 to file 5 block 1 File: /u01/app/oracle/oradata/PROD/tp01.dbf (5) Block: 1 Offsets: 0 to 19 Dba:0x01400001 --------------------------

bbed 修复数据文件头

把同一表空间下的好的数据文件头拷贝到有问题的数据文件头,例如: copy file x block 1 to file y block 1,然后按如下offset来确认并修改. rdba_kcbh (offset  4)  即使文件头block的rdba地址 2. kccfhfsz (offset  44) 即文件大小 3. kccfhfno (offset  52) 即datafile文件号 4. kscnbas  (offset 100) 即v$datafile.create_change#

使用BBED理解和修改Oracle数据块

1.生成bbed list file文件: SQL> select file#||' '||name||' '||bytes from v$datafile; $ vim dbfile.txt 1 /u01/app/oradata/sydb/system01.dbf 754974720 2 /u01/app/oradata/sydb/sysaux01.dbf 587202560 3 /u01/app/oradata/sydb/undotbs01.dbf 429916160 4 /u01/app/