数据库版本11.2.0.4
实验思路是: –其中数据库OPEN时的TRACE信息
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 数据文件头可见以下信息:
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如何转换为具体的文件号及块号? – 第一小节
计算的大致方法示例如下:
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 292c0103 033e6466 033e6466 09382e30 2e302e30 2e300106
e501
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.e1idc.net