实验思路是: --其中数据库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/16369041Creation 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.bbdblocksize=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
[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进制中两个字符表示