使用BBED查看SYSTEM文件头的root dba及bootstrap$

来源:互联网 发布:医疗大数据上市公司 编辑:程序博客网 时间:2024/06/05 18:50
数据库版本11.2.0.4
实验思路是:     --其中数据库OPEN时的TRACE信息,可以参考:http://blog.csdn.net/q947817003/article/details/17025489
file#1 block#1==>root dba==>struct ktetb
即先从SYSTEM的数据文件头:file#1 block#1 找到root dba的位置,然后在root dba所在的块内,找到struct ktetb 所描述的块的位置,然后查看struct ktetb指定的块中的内容(bootstrap$ 的内容)

1.使用DUMP数据文件头查看root dba

DUMP 数据文件头可见以下信息: --具体方法见:http://blog.csdn.net/q947817003/article/details/16369041
Creation   at   scn: 0x0000.00000015 11/14/2013 14:24:22
Backup taken at scn: 0x0000.00000000 01/01/1988 00:00:00 thread:0  
 reset logs count:0x318f5cd7 scn: 0x0000.00000001
 prev reset logs count:0x0 scn: 0x0000.00000000
 recovered at 11/15/2013 10:50:16
 status:0x2004 root dba:0x00400208 chkpt cnt: 67 ctl cnt:66
##########
只有system才有root dba,用来定位bootstrap$,存储的是16进制表示的二进制数,其中10bit是数据文件号, 22 bit是BLOCK号。
ctl cnt 是控制文件的一份拷贝,用于鉴别控制文件是否来自于备份.
关于root dba:在SYSTEM文件头,Oracle存储了一个root dba:
Root dba: This field only occurs in data file #1, and is the location of blocks required during bootstrapping the data dictionary (bootstrap$)。
ORACLE 10g之前, root dba:0x004001a1,指向file 1 block 417对象,DUMP 417对象可以发现最终指向的是file 1 block 377。
ORACLE 10G中是root dba:0x00400179,指向file 1 block 377
ORACLE 11G中root dba:0x00400208,指向file 1 block 520
################
在11G中root dba:0x00400208具体指向位置计算方法如下:     --一个字节8bit,一个16进制可以表示4bit二进制
首先算出来每一个byte对应的二进制值,如下:
00000000    01000000    00000010    00001000
前10bit 文件号:  0000000001   
后22bit 块号:   0000000000001000001000
对应的10进制的文件号和块号是:1号文件的520号块
BYS@ bys3>select bit_to_number('0000000001') from dual;
BIT_TO_NUMBER('0000000001')
---------------------------
                          1
BYS@ bys3>select bit_to_number('0000000000001000001000') from dual;
BIT_TO_NUMBER('0000000000001000001000')
---------------------------------------
                                    520
####################################################################

2.使用bbed来查看root dba的指向

[oracle@bys3 ~]$ cat par.bbd
blocksize=8192
listfile=bbedfile.txt
mode=edit
[oracle@bys3 ~]$ cat bbedfile.txt
1       /u01/oradata/bys3/system01.dbf  524288000
2       /u01/oradata/bys3/sysaux01.dbf  340787200
3       /u01/oradata/bys3/undotbs01.dbf 209715200
4       /u01/oradata/bys3/user01.dbf    52428800
[oracle@bys3 ~]$ bbed parfile=par.bbd
Password:
BBED: Release 2.0.0.0.0 - Limited Production on Fri Nov 29 09:22:04 2013
Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.
************* !!! For Oracle Internal Use only !!! ***************
BBED> show all
        FILE#           1
        BLOCK#          1
        OFFSET          0
        DBA             0x00400001 (4194305 1,1)
        FILENAME        /u01/oradata/bys3/system01.dbf
        BIFILE          bifile.bbd
        LISTFILE        bbedfile.txt
        BLOCKSIZE       8192
        MODE            Edit
        EDIT            Unrecoverable
        IBASE           Dec
        OBASE           Dec
        WIDTH           80
        COUNT           512
        LOGFILE         log.bbd
        SPOOL           No
BBED> map /v    ---截取部分
 File: /u01/oradata/bys3/system01.dbf (1)
 Block: 1                                     Dba:0x00400001
------------------------------------------------------------
 Data File Header

 struct kcvfh, 860 bytes                    @0       
    struct kcvfhbfh, 20 bytes               @0       
    struct kcvfhhdr, 76 bytes               @20      
    ub4 kcvfhrdb                            @96      
    struct kcvfhcrs, 8 bytes                @100     
    ub4 kcvfhcrt                            @108     
    ub4 kcvfhrlc                            @112
BBED> print kcvfhrdb         ---kcvfhrdb就是root dba指向的具体数据块位置
ub4 kcvfhrdb                                @96       0x00400208
oracle引导会去读这个地方:file# 1 block# 520
0x00400208如何转换为具体的文件号及块号?   ---详见上一步或者:http://blog.csdn.net/q947817003/article/details/16996475 第一小节
计算的大致方法示例如下:
DBA(data block address)===file#(10bit)+block#(22bit)==32bit
16进制中两个字符表示1bytes,
DBA=0x00400001====> 转换为二进制为:00000000 01000000  00000000 00000001
file#=00000000 01 -----文件号
block#=000000  00000000 00000001  -->号块
此处的计算是:
0x00400208先转换为二进制为:00000000 01000000  00000010 00001000
数据文件号是:0000000001     数据块号是:0000000000001000001000

BYS@ bys3>select bit_to_number('0000000001')  from dual;
BIT_TO_NUMBER('0000000001')
---------------------------
                          1
BYS@ bys3>select bit_to_number('0000000000001000001000')  from dual;
BIT_TO_NUMBER('0000000000001000001000')
---------------------------------------
                                    520
##################################################################################################

3.在数据库中查询file# 1 header_block=520的块的信息--- bootstrap$

BYS@ bys3>col segment_name for a15
BYS@ bys3>select segment_name,segment_type,header_file,header_block from dba_segments where header_block=520;
SEGMENT_NAME    SEGMENT_TYPE       HEADER_FILE HEADER_BLOCK
--------------- ------------------ ----------- ------------
BOOTSTRAP$      TABLE                        1          520
截取bootstrap$;表的前几行
SYS@ bys3>col SQL_TEXT for a110
SYS@ bys3>select * from bootstrap$;   --截取部分
     LINE#       OBJ# SQL_TEXT
---------- ---------- --------------------------------------------------------------------------------------------------------------
        -1         -1 8.0.0.0.0                        -----兼容8.0以后版本
         0          0 CREATE ROLLBACK SEGMENT SYSTEM STORAGE (  INITIAL 112K NEXT 56K MINEXTENTS 1 MAXEXTENTS 32765 OBJNO 0 EXTENTS
                      (FILE 1 BLOCK 128))             --创建系统回滚段

        20         20 CREATE TABLE ICOL$("OBJ#" NUMBER NOT NULL,"BO#" NUMBER NOT NULL,"COL#" NUMBER NOT NULL,"POS#" NUMBER NOT NULL,
                      "SEGCOL#" NUMBER NOT NULL,"SEGCOLLENGTH" NUMBER NOT NULL,"OFFSET" NUMBER NOT NULL,"INTCOL#" NUMBER NOT NULL,"S
                      PARE1" NUMBER,"SPARE2" NUMBER,"SPARE3" NUMBER,"SPARE4" VARCHAR2(1000),"SPARE5" VARCHAR2(1000),"SPARE6" DATE) S
                      TORAGE (  OBJNO 20 TABNO 4) CLUSTER C_OBJ#(BO#)

        42         42 CREATE INDEX I_ICOL1 ON ICOL$(OBJ#) PCTFREE 10 INITRANS 2 MAXTRANS 255 STORAGE (  INITIAL 64K NEXT 1024K MINEX
                      TENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 OBJNO 42 EXTENTS (FILE 1 BLOCK 384))

使用Ultraedit把文字转换为16进制OBJ#=0行的SQL_TEXT转换为16进制数:
   --用于下一步时与BBED DUMP数据块的信息对比
00000000h: 43 52 45 41 54 45 20 52 4F 4C 4C 42 41 43 4B 20 ; CREATE ROLLBACK
00000010h: 53 45 47 4D 45 4E 54 20 53 59 53 54 45 4D 20 53 ; SEGMENT SYSTEM S
00000020h: 54 4F 52 41 47 45 20 28 20 20 49 4E 49 54 49 41 ; TORAGE (  INITIA
00000030h: 4C 20 31 31 32 4B 20 4E 45 58 54 20 35 36 4B 20 ; L 112K NEXT 56K
00000040h: 4D 49 4E 45 58 54 45 4E 54 53 20 31 20 4D 41 58 ; MINEXTENTS 1 MAX
00000050h: 20 45 58 54 45 4E 54 53 20 33 32 37 36 35 20 4F ;  EXTENTS 32765 O
00000060h: 42 4A 4E 4F 20 30 20 45 58 54 45 4E 54 53 20 28 ; BJNO 0 EXTENTS (
00000070h: 46 49 4C 45 20 31 20 42 4C 4F 43 4B 20 31 32 38 ; FILE 1 BLOCK 128
00000080h: 29 29                                           ; ))
#############################################################################################################

4.使用BBED查看root dba的指向的file# 1 block# 520的详细信息

接第2步中BBED的使用
BBED> set dba 0x00400208
        DBA             0x00400208 (4194824 1,520)
        BBED> show all
        FILE#           1
        BLOCK#          520
        OFFSET          0
        DBA             0x00400208 (4194824 1,520)
        FILENAME        /u01/oradata/bys3/system01.dbf
        BIFILE          bifile.bbd
        LISTFILE        bbedfile.txt
        BLOCKSIZE       8192
        MODE            Edit
        EDIT            Unrecoverable
        IBASE           Dec
        OBASE           Dec
        WIDTH           80
        COUNT           512
        LOGFILE         log.bbd
        SPOOL           No
BBED> map
 File: /u01/oradata/bys3/system01.dbf (1)
 Block: 520                                   Dba:0x00400208
------------------------------------------------------------
 Unlimited Data Segment Header
 struct kcbh, 20 bytes                      @0       
 struct ktech, 72 bytes                     @20      
 struct ktemh, 16 bytes                     @92      
 struct ktetb[1], 8 bytes                   @108     
 struct ktshc, 8 bytes                      @4148    
 struct ktsfs_seg[1], 20 bytes              @4156    
 struct ktsfs_txn[16], 320 bytes            @4176    
 ub4 tailchk                                @8188
BBED> print ktemh        
struct ktemh, 16 bytes                      @92      
   ub4 count_ktemh                          @92       0x00000001
   ub4 next_ktemh                           @96       0x00000000
   ub4 obj_ktemh                            @100      0x0000003b
   ub4 flag_ktemh                           @104      0x40000000
#################
ub4 obj_ktemh                            @100      0x0000003b
这一句描述的就是:root dba指向的object对象号:0x0000003b,依照以下方法转换为十进制,为:59

在数据库中据此对象号也可以查询出此表
BYS@ bys3>select to_number('3b','xxxxxxxxxx') from dual;
TO_NUMBER('3B','XXXXXXXXXX')
----------------------------
                          59
BYS@ bys3>select name from sys.obj$ where obj#=59;   ---从数据库中也可以验证这个对象号指的是 BOOTSTRAP$
NAME
------------------------------
BOOTSTRAP$
####################

5.使用BBED来验证BOOTSTRAP$表中OBJ#=0行记录是否存在于struct ktetb[1]指向的DBA 0x00400209中的信息

知道了BOOTSTRAP$对象号,那么BOOTSTRAP$记录的具体内容(select * from bootstrap$;)  -存储在:file#1 block#520的struct ktetb[1]字段指向的块
BBED> print ktetb     --接上一步BBED操作
struct ktetb[0], 8 bytes                    @108     
   ub4 ktetbdba                             @108      0x00400209
   ub4 ktetbnbk                             @112      0x00000007
BBED> set dba 0x00400209
        DBA             0x00400209 (4194825 1,521)
BBED> set offset 8030    
        OFFSET          8030
--这个偏移量是书上看的,笨方法是把整个数据块8192字节都DUMP出来的16进制数全复制出来放在一个空文件中,然后使用第3步Ultraedit转换出来的16进制数字符,来查找,一个个查哈哈。
BBED> dump        --DUMP出来的数据和第3步Ultraedit转换出来的16进制数字符可以一一对应
 File: /u01/oradata/bys3/system01.dbf (1)
 Block: 521              Offsets: 8030 to 8191           Dba:0x00400209
------------------------------------------------------------------------
 2c010301 80018081 43524541 54452052 4f4c4c42 41434b20 5345474d 454e5420
 53595354 454d2053 544f5241 47452028 2020494e 49544941 4c203131 324b204e
 45585420 35364b20 4d494e45 5854454e 54532031 204d4158 45585445 4e545320
 33323736 35204f42 4a4e4f20 30204558 54454e54 53202846 494c4520 3120424c
 4f434b20 31323829 29
2c0103 033e6466 033e6466 09382e30 2e302e30 2e300106
 e501
 <32 bytes per line>