使用BBED檢視SYSTEM檔案頭的root dba及bootstrap$

還不算暈發表於2013-11-29
資料庫版本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>

相關文章