关于10g中的bootstrap$

| No Comments

从"关于10g中的X$KCVFH(续2"这篇文章里,我们可以知道x$kcvfh中字段FHRDB的含义是Root dba: This field only occurs in data file #1, and is the location of blocks required during bootstrapping the data dictionary (bootstrap$)实际上就是指向了obj#=56object,也就是指向了表bootstrap$

 

bootstrap$实际上存储的是数据字典的基表的定义,如OBJ$,C_OBJ$,TAB$等等。Oracle通过读取这些定义创建数据字典的基表,进而创建数据字典。

 

也就是说这里大概的流程是先读root dba,再通过root dba去找bootstrap$中存储的那些数据字典的基表的定义,最后根据这些定义创建数据字典。即所谓的一生二,二生三,三生万物

 

在上述文章里,我们通过root dba找到了表bootstrap$obj#,但现在的问题是:只知道bootstrap$obj#是不够的,bootstrap$中的记录到底存在哪里?

 

答案是bootstrap$中记录的地址实际上是存在ktetb[0]. ktetbdba

 

好了,我们这里来证明上述观点:

SQL> desc bootstrap$;

Name     Type           Nullable Default Comments

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

LINE#    NUMBER                                   

OBJ#     NUMBER                                  

SQL_TEXT VARCHAR2(4000)                          

 

SQL> select count(*) from bootstrap$;

 

  COUNT(*)

----------

        57

 

SQL> select * from bootstrap$ where obj#=0;

 

   LINE#   OBJ#   SQL_TEXT

--------------- --------- ----------------------------------------------------------------------------------------------         0          0 CREATE ROLLBACK SEGMENT SYSTEM STORAGE (  INITIAL 112K NEXT 1024K MINEXTENTS 1 MAXEXTENTS 32765 OBJNO 0 EXTENTS (FILE 1 BLOCK 9))

 

SQL> select dump(0,16) from dual;

 

DUMP(0,16)

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

Typ=2 Len=1: 80

上述记录里SQL_TEXT为"CREATE ROLLBACK SEGMENT SYSTEM STORAGE (  INITIAL 112K NEXT 1024K MINEXTENTS 1 MAXEXTENTS 32765 OBJNO 0 EXTENTS (FILE 1 BLOCK 9))",在ultraEdit里看一下其16进制编码,上述语句的16进制编码为:

43 52 45 41 54 45 20 52 4F 4C 4C 42 41 43 4B 20

53 45 47 4D 45 4E 54 20 53 59 53 54 45 4D 20 53

54 4F 52 41 47 45 20 28 20 20 49 4E 49 54 49 41

4C 20 31 31 32 4B 20 4E 45 58 54 20 31 30 32 34

4B 20 4D 49 4E 45 58 54 45 4E 54 53 20 31 20 4D

41 58 45 58 54 45 4E 54 53 20 33 32 37 36 35 20

4F 42 4A 4E 4F 20 30 20 45 58 54 45 4E 54 53 20

28 46 49 4C 45 20 31 20 42 4C 4F 43 4B 20 39 29

29                                            

按照上述观点,在ktetb[0]. ktetbdba所指向的的那个block里一定会有一条记录,这条记录有三个column,这三个column的值分别为8080

43 52 45 41 54 45 20 52 4F 4C 4C 42 41 43 4B 20

53 45 47 4D 45 4E 54 20 53 59 53 54 45 4D 20 53

54 4F 52 41 47 45 20 28 20 20 49 4E 49 54 49 41

4C 20 31 31 32 4B 20 4E 45 58 54 20 31 30 32 34

4B 20 4D 49 4E 45 58 54 45 4E 54 53 20 31 20 4D

41 58 45 58 54 45 4E 54 53 20 33 32 37 36 35 20

4F 42 4A 4E 4F 20 30 20 45 58 54 45 4E 54 53 20

28 46 49 4C 45 20 31 20 42 4C 4F 43 4B 20 39 29

29

 

好了,我们现在来验证一下:

BBED> set file 1

        FILE#           1

 

BBED> set block 377

        BLOCK#          377

 

BBED> p ktetb

struct ktetb[0], 8 bytes                    @108    

   ub4 ktetbdba                             @108      0x0040017a

   ub4 ktetbnbk                             @112      0x00000007

 

SQL> exec cdba('0040017a','H');

.

The file is 1

The block is 378

 

BBED> set block 378

        BLOCK#          378

 

BBED> set offset 8030

        OFFSET          8030

 

BBED> dump

 File: /iprat02/ipratest/system01.dbf (1)

 Block: 378              Offsets: 8030 to 8191           Dba:0x0040017a

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

 2c010301 80018081 43524541 54452052 4f4c4c42 41434b20 5345474d 454e5420

 53595354 454d2053 544f5241 47452028 2020494e 49544941 4c203131 324b204e

 45585420 31303234 4b204d49 4e455854 454e5453 2031204d 41584558 54454e54

 53203332 37363520 4f424a4e 4f203020 45585445 4e545320 2846494c 45203120

 424c4f43 4b203929 292c0103 033e6466 033e6466 09382e30 2e302e30 2e30015b

 0601

 

这里我们可以看到,bootstrap$ obj#=0的那条记录确实是存在上述block中,即我们的观点得到证明

Leave a comment