DBID及DB_NAME的查看在最后。
进入BBED及初始设置如下:
[oracle@bys3 ~]$
cat par.bbd
blocksize=8192
listfile=bbedfile.txt
mode=edit
[oracle@bys3 ~]$
cat bbedfile.txt --可以通过select file#,name from v$dbfile; select file#,name from v$datafile;
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: -
-输入默认密码 blockedit
BBED: Release 2.0.0.0.0 - Limited Production on Thu Nov 28 10:14:54 2013
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
************* !!! For Oracle Internal Use only !!! ***************
BBED> show all --如下面所示
一、关于BBED使用命令show all中显示DBA的计算:
BBED> show all
---这命令显示了当前的文件号、BLOCK号,偏移号、COUNT数等信息。需要提前SET FILE SET BLOCKSIZE SET BLOCK等
FILE# 1
BLOCK# 1
OFFSET 0
DBA 0x00400001 (4194305 1,1) -------
表示的是当前的FILE 1的BLOCK 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
计算如下:
DBA(data block address)===file#(10bit)+block#(22bit)==32bit
16进制中两个字符表示1bytes,
DBA=0x00400001====> 转换为二进制为:00000000 01000000 00000000 00000001
file#=00000000 01 -----1号文件
block#=000000 00000000 00000001 -->号块
所以对于DBA=0x00400001的计算如下:
示例计算DBA=0x00400001前四个字符对应的二进制数值:--注意要两个两个的计算,0x表示是16进制,不是具体的数值。
BYS@ bys3>select number_to_bit(to_number('00','xxxxxxx')) num from dual; -
--这里的number_to_bit函数系统没有,自己建的,见:http://blog.csdn.net/q947817003/article/details/14103801
NUM
--------------------
00000000
BYS@ bys3>select number_to_bit(to_number('40','xxxxxxx')) num from dual;
NUM
--------------------
01000000
所以前四个字符合起来对应的是二进制的:0000000001000000
二进制中一个字符占用一个bit,故10bit就相当于前10个字符:00000000010:
使用二进制转换为10进制的函数进行转换:
BYS@ bys3>col num format 99999
BYS@ bys3>select bit_to_number('0000000001') from dual;
BIT_TO_NUMBER('0000000001')
---------------------------
1
故DBA=0x00400001对应的数据文件号是1
同样的方法计算DBA=0x00400001对应的block#:也为1
BYS@ bys3>select bit_to_number('0000000000000001') from dual;
BIT_TO_NUMBER('0000000000000001')
---------------------------------
1
##########################################################################
二、使用BBED的map命令查看1号块
BBED> map
File: /u01/oradata/bys3/system01.dbf (1)
Block: 1 Dba:0x00400001
------------------------------------------------------------
Data File Header
struct kcvfh, 860 bytes @0
ub4 tailchk @8188
解读:块号是:1,块的DBA:0x00400001 即1号数据文件的1号块
Data File Header表示是数据文件 头
struct kcvfh, 860 bytes 表示大小为860个bytes,据说在不同版本大小不一样
@0 表示从第一个字节开始
ub4 tailchk 表示4个块表示检验 ub4 --unsigned byte 4 无符号字节
@8188 从8188开始,8188 8189 8190 8191 这四个。
########################
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
struct kcvfhrls, 8 bytes @116
ub4 kcvfhbti @124
struct kcvfhbsc, 8 bytes @128
ub2 kcvfhbth @136
ub2 kcvfhsta @138
struct kcvfhckp, 36 bytes @484
ub4 kcvfhcpc @140
ub4 kcvfhrts @144
ub4 kcvfhccc @148
struct kcvfhbcp, 36 bytes @152
ub4 kcvfhbhz @312
struct kcvfhxcd, 16 bytes @316
sword kcvfhtsn @332
ub2 kcvfhtln @336
text kcvfhtnm[30] @338
ub4 kcvfhrfn @368
struct kcvfhrfs, 8 bytes @372
ub4 kcvfhrft @380
struct kcvfhafs, 8 bytes @384
ub4 kcvfhbbc @392
ub4 kcvfhncb @396
ub4 kcvfhmcb @400
ub4 kcvfhlcb @404
ub4 kcvfhbcs @408
ub2 kcvfhofb @412
ub2 kcvfhnfb @414
ub4 kcvfhprc @416
struct kcvfhprs, 8 bytes @420
struct kcvfhprfs, 8 bytes @428
ub4 kcvfhtrt @444
ub4 tailchk @8188
简单解读:
struct kcvfhbfh, 20 bytes @0
struct kcvfhhdr, 76 bytes @20
ub4 kcvfhrdb @96
比如以上三条:truct kcvfhbfh, 20 bytes 从0bite到19bite
struct kcvfhhdr, 76 bytes @20 从20到95bit
如果想查询kcvfhhdr这76bit具体信息,可以使用命令:print kcvfhbfh
################
三、计算DBID及DB_NAME
BBED> print kcvfhhdr --打印出更详细信息,接上面。
struct kcvfhhdr, 76 bytes @20
ub4 kccfhswv @20 0x00000000
ub4 kccfhcvn @24 0x0b200000
ub4 kccfhdbi @28 0xc82c8d97
text kccfhdbn[0] @32 B
text kccfhdbn[1] @33 Y
text kccfhdbn[2] @34 S
text kccfhdbn[3] @35 3
text kccfhdbn[4] @36
text kccfhdbn[5] @37
text kccfhdbn[6] @38
text kccfhdbn[7] @39
ub4 kccfhcsq @40 0x000017bd
ub4 kccfhfsz @44 0x0000fa00
s_blkz kccfhbsz @48 0x00
ub2 kccfhfno @52 0x0001
ub2 kccfhtyp @54 0x0003
ub4 kccfhacid @56 0x00000000
ub4 kccfhcks @60 0x00000000
text kccfhtag[0] @64
text kccfhtag[1] @65
text kccfhtag[2] @66
text kccfhtag[3] @67
text kccfhtag[4] @68
text kccfhtag[5] @69
text kccfhtag[6] @70
text kccfhtag[7] @71
text kccfhtag[8] @72
text kccfhtag[9] @73
text kccfhtag[10] @74
text kccfhtag[11] @75
text kccfhtag[12] @76
text kccfhtag[13] @77
text kccfhtag[14] @78
text kccfhtag[15] @79
text kccfhtag[16] @80
text kccfhtag[17] @81
text kccfhtag[18] @82
text kccfhtag[19] @83
text kccfhtag[20] @84
text kccfhtag[21] @85
text kccfhtag[22] @86
text kccfhtag[23] @87
text kccfhtag[24] @88
text kccfhtag[25] @89
text kccfhtag[26] @90
text kccfhtag[27] @91
text kccfhtag[28] @92
text kccfhtag[29] @93
text kccfhtag[30] @94
text kccfhtag[31] @95
####################
DBID是对应的:ub4 kccfhdbi @28 0xc82c8d97 kccfhdbi--这个名字最后三位也能联想下DBID
可以计算出DBID:16进制c82c8d97,转换为10进制数字:
BYS@ bys3>select name,dbid from v$database;
NAME DBID
--------- ----------
BYS3
3358363031
BYS@ bys3>select to_number('c82c8d97','xxxxxxxxxxxxx') from dual;
TO_NUMBER('C82C8D97','XXXXXXXXXXXXX')
-------------------------------------
3358363031
这里使用print kcvfhhdr中的16进制数不需要颠倒字节顺序,因为BBED里面已经转换过了。
解释:ub4 kccfhdbi @28 0xc82c8d97
text kccfhdbn[0] @32 B
这表示ub4 kccfhdbi具体是在28,29.30.31这中个块上,
对应的DUMP是在:=见图3 16进制值是978d2cc8,需要颠倒一下即为:c82c8d97
DB_NAME从下面几个字节可以看出--不需要计算了:--也可以看出,DB_NAME不能超过8个字符的原因了
text kccfhdbn[0] @32 B
text kccfhdbn[1] @33 Y
text kccfhdbn[2] @34 S
text kccfhdbn[3] @35 3
text kccfhdbn[4] @36
text kccfhdbn[5] @37
text kccfhdbn[6] @38
text kccfhdbn[7] @39
这里演示一下计算的方法:
--kccfhdbn 看起来最后几个字母也像是DBNAME
32BIT-38BIT,对应的图3中的42595333 00000000
因为是字符型 ,不需要颠倒。
可以使用以下两种函数转换:
BYS@ bys3>
select chr(to_number((substr(replace('42595333 00000000',' '),rownum*2-1,2)),'xxxxxxxxxxx')) from dba_objects where rownum<9;
CHR(
----
B
Y
S
3
8 rows selected.
上一句:dba_objects在这里是只来显示相应的虚字段值了,保险起见应该选用一个行数大于8字节的表或视图就可以。
BYS@ bys3>
select UTL_RAW.CAST_TO_VARCHAR2 ('4259533300000000') from dual; ---注意要去掉两组数之间空格
UTL_RAW.CAST_TO_VARCHAR2('4259533300000000')
----------------------------------------------------------------------------------------------------
BYS3