bbed的使用--安装及初探

时间:2023-01-16 16:18:14
bbed是oracle内部一款用来直接查看和修改数据文件数据的工具,可以直接修改Oracle数据文件块的内容,在一些特殊恢复场景下比较有用。

1.bbed 的安装

在9i/10g中连接生成bbed:
cd $ORACLE_HOME/rdbms/lib
make -f ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed

11g中缺省未提供BBED库文件,但可以把10g的文件copy到相应目录下,再进行编译

oracle 11g中缺bbed包,oracle11g bbed install and example
上传(sbbdpt.o ssbbded.o bbedus.msb,该三个文件拷贝oracle的linux64版本的)文件
$ORACLE_HOME/rdbms/lib/ssbbded.o
$ORACLE_HOME/rdbms/lib/sbbdpt.o
$ORACLE_HOME/rdbms/mesg/bbedus.msb

执行如下命令:
cd $ORACLE_HOME/rdbms/lib
make -f $ORACLE_HOME/rdbms/lib/ins_rdbms.mk BBED=$ORACLE_HOME/bin/bbed $ORACLE_HOME/bin/bbed

2.bbed 的使用

[oracle@ora11g ~]$ bbed -help
LRM-: syntax error at '-' at the end of input
PASSWORD - Required parameter
FILENAME - Database file name
BLOCKSIZE - Database block size
LISTFILE - List file name
MODE - [browse/edit]
SPOOL - Spool to logfile [no/yes]
CMDFILE - BBED command file name
LOGFILE - BBED log file name
PARFILE - Parameter file name
BIFILE - BBED before-image file name
REVERT - Rollback changes from BIFILE [no/yes]
SILENT - Hide banner [no/yes]
HELP - Show all valid parameters [no/yes]
BBED-: LRM error  occurred during command line parsing

为了用起来方便,可以先定义一个文件,将数据文件查询出来,放入到参数文件中

[oracle@ora11g ~]$ vi parameter.txt
blocksize=
listfile=dbfiles.txt
mode=edit

$vi dbfiles.txt
)||name||chr()||bytes from v$datafile;
    /u01/app/oracle/oradata/test1212/system01.dbf
    /u01/app/oracle/oradata/test1212/sysaux01.dbf
    /u01/app/oracle/oradata/test1212/undotbs01.dbf
    /u01/app/oracle/oradata/test1212/users01.dbf
    /u01/app/oracle/oradata/test1212/ss01.dbf    

用了参数文件之后再次进入:

[oracle@ora11g ~]$ bbed parfile=parameter.txt
Password: 

BBED: Release  - Limited Production on Fri Feb  :: 

Copyright (c) , , Oracle and/or its affiliates.  All rights reserved.

************* !!! For Oracle Internal Use only !!! ***************

BBED> 

3.初步使用

info命令 --显示当前可以进行browse 或者edit 的file。即filelist 里指定的datafile信息。

BBED> info
 File#  Name                                                        Size(blks)
 -----  ----                                                        ----------

show命令 -- 显示当前的配置选项

BBED> show all

    BLOCK#
    OFFSET              --偏移量,0代表从第1个字节,
    DBA                 ,) --DBA(data block addr)的组成 = 文件号 + 块号,一共32位
    FILENAME           /u01/app/oracle/oradata/test1212/system01.dbf
    BIFILE             bifile.bbd
    LISTFILE           dbfiles.txt
    BLOCKSIZE
    MODE               Edit
    EDIT               Unrecoverable
    IBASE              Dec
    OBASE              Dec
    WIDTH              

    LOGFILE            log.bbd
    SPOOL              No

备注:

DBA(data block addr) = file#(10bit) + block#(22bit) =32bit
所以文件个数最多是2的10次方=1024个

DBA = 0x00400001 ====> 0000 0000 0100 0000 0000 0000 0000 0001
从以上所知的前10位为file#,所以可以放一个分隔符再看:
0000 0000 01[分隔符]00 0000 0000 0000 0000 0001 (4194305 1,1)
可以看出file#=1,block#=1 ,就和上面的show出来的信息对应起来了

set命令 --设置相应的信息

如果要查看2号文件的2号块,则可以使用set命令来设置文件号和块号

BBED

BBED
    BLOCK#             

BBED> show all

    BLOCK#
    OFFSET
    DBA                 ,)
    FILENAME           /u01/app/oracle/oradata/test1212/sysaux01.dbf
    BIFILE             bifile.bbd
    LISTFILE           dbfiles.txt
    BLOCKSIZE
    MODE               Edit
    EDIT               Unrecoverable
    IBASE              Dec
    OBASE              Dec
    WIDTH              

    LOGFILE            log.bbd
    SPOOL              No

DBA        

再次回到1号文件的0号块

BBED

BBED
    BLOCK#             

BBED> show all

    BLOCK#
    OFFSET
    DBA                 ,)
    FILENAME           /u01/app/oracle/oradata/test1212/system01.dbf
    BIFILE             bifile.bbd
    LISTFILE           dbfiles.txt
    BLOCKSIZE
    MODE               Edit
    EDIT               Unrecoverable
    IBASE              Dec
    OBASE              Dec
    WIDTH              

    LOGFILE            log.bbd
    SPOOL              No

dump命令 --十六进制查看block

dump /v --查看十六进制内容的同时以文本方式“翻译”十六进制显示的内容,相当于对当前block执行strings命令

BBED> dump
 )
 Block:                             Dba:0x00400000
------------------------------------------------------------------------
 00a20000 0000c0ff   67ae0000   7d7c7b7a
 a0810000        

  bytes per line>

备注:

从Offsets可以看出,只显示了0-511个字节的偏移,也就是512个字节的信息,因为默认是 COUNT=512
我们知道oracle一个块默认大小8192,所以如果要让一个块的dump信息显示完全的话,就可以set count 8192,再执行dump

map命令 --Map会通过偏移量来显示block里的详细信息,如block header,data block header 和row directory。 
在不指定block的情况下,会显示当前block的信息,如果想显示其他block的信息,可以使用file name,file id,block 和DBA 来指定要显示的block。

BBED> map
 )
 Block:                                      Dba:0x00400001
------------------------------------------------------------
 Data File Header
 struct kcvfh,  bytes                    @0
 ub4 tailchk                                @8188  

备注:
u 代表没有符号的 unsigned
tailchk 尾部校验,一共是8192个块,因为是从0开始的,所以最后一个字节是8191,换句话说就是从8188-8191这4个字节是不能用的,是拿来做尾部校验的

struct kcvfh ,其中的kcvfh其实在oracle中也有一个视图可以查询select * from x$kcvfh; 今后再进行仔细研究

map /v --比map更详细的查看block里面的信息

 BBED> map /v
 )
 Block:                                      Dba:0x00400001
------------------------------------------------------------
 Data File Header

 struct kcvfh,  bytes                    @0
    struct kcvfhbfh,  bytes               @0
    struct kcvfhhdr,  bytes               @20
    ub4 kcvfhrdb                            @96
    struct kcvfhcrs,  bytes                @100
    ub4 kcvfhcrt                            @108
    ub4 kcvfhrlc                            @112
    struct kcvfhrls,  bytes                @116
    ub4 kcvfhbti                            @124
    struct kcvfhbsc,  bytes                @128
    ub2 kcvfhbth                            @136
    ub2 kcvfhsta                            @138
    struct kcvfhckp,  bytes               @484
    ub4 kcvfhcpc                            @140
    ub4 kcvfhrts                            @144
    ub4 kcvfhccc                            @148
    struct kcvfhbcp,  bytes               @152
    ub4 kcvfhbhz                            @312
    struct kcvfhxcd,  bytes               @316
    sword kcvfhtsn                          @332
    ub2 kcvfhtln                            @336
    ]                       @338
    ub4 kcvfhrfn                            @368
    struct kcvfhrfs,  bytes                @372
    ub4 kcvfhrft                            @380
    struct kcvfhafs,  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,  bytes                @420
    struct kcvfhprfs,  bytes               @428
    ub4 kcvfhtrt                            @444
 ub4 tailchk                                @8188   

print命令 --查看命令,可以用p来简写

如果想对上面的 struct kcvfhbfh再进行详细的查看,可以使用命令print来查看

BBED> p kcvfhbfh
struct kcvfhbfh,  bytes                   @0
   ub1 type_kcbh                            @0        0x0b
   ub1 frmt_kcbh                            @1        0xa2
   ub1 spare1_kcbh                          @2        0x00
   ub1 spare2_kcbh                          @3        0x00
   ub4 rdba_kcbh                            @4        0x00400001
   ub4 bas_kcbh                             @8        0x00000000
   ub2 wrp_kcbh                             @12       0x0000
   ub1 seq_kcbh                             @14       0x01
   ub1 flg_kcbh                             @15       0x04 (KCBHFCKV)
   ub2 chkval_kcbh                          @16       0xe81a
   ub2 spare3_kcbh                          @18       0x0000