Quantcast
Channel: CSDN博客推荐文章
Viewing all articles
Browse latest Browse all 35570

使用BBED查看数据文件头简单使用及查询DBID/DB_NAME等信息

$
0
0

DBID及DB_NAME的查看在最后。

一、关于BBED使用命令show all中显示DBA的计算:

BBED> show all        ---这命令显示了当前的文件号、BLOCK号,偏移号、COUNT数等信息。
        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
计算如下:
DBA(data block edit)===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: dump FILE1 BLOCK1 查看数据文件中块大小:

首先从操作系统中使用命令查看数据文件:
[oracle@mydb ocm]$ dbfsize system01.dbf
Database file: system01.dbf
Database file type: file system
Database file size: 64000 8192 byte blocks
即数据文件有64000个块,每个块8192 byte
在BBED中,首先设置BLOCK为0,然后DUMP,数据文件块大小及块个数对应的字段如图1-


关于大小字节序简单概述:
ORACLE数据库中元数据(数据字典里的):
字符不用颠倒 char varchar
数字需要颠倒  number
表里面数据是NUMBER类型的不需要颠倒==ORACLE来处理
如图中:
00200000  是块大小,是数字,需要颠倒-每2位表示1bytes,要以两位(即为1bytes)单位颠倒:颠倒后是:00002000
BYS@ bys3>select to_number('00002000','xxxxxxxxxxxxx') from dual;
TO_NUMBER('00002000','XXXXXXXXXXXXX')
-------------------------------------
                                 8192
00fa0000  是BLOKC的个数:数字类型,需要颠倒,颠倒后是:===>0000fa00
BYS@ bys3>select to_number('0000fa00','xxxxxxxxxxxxx') from dual;
TO_NUMBER('0000FA00','XXXXXXXXXXXXX')
-------------------------------------
                                64000
 BBED> map
 File: /u01/oradata/bys3/system01.dbf (1)
 Block: 0                                     Dba:0x00400000
------------------------------------------------------------
BBED-00400: invalid blocktype (00)
##################################################################

三、使用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       
这里演示一下计算的方法:
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
作者:q947817003 发表于2013-11-28 1:04:11 原文链接
阅读:94 评论:0 查看评论

Viewing all articles
Browse latest Browse all 35570

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>