BBED是用来直接查看和修改数据文件数据的一个工具,是Oracle一款内部工具,可以直接修改Oracle数据文件块的内容,在一些极端恢复场景下比较有用。要想使用该工具,需用户自己安装,在Oracle9i和10g版本中,安装的方法很简单:

[oracle@node1u01]$cd$ORACLE_HOME/rdbms/lib/

[oracle@node1lib]$make-fins_rdbms.mk$ORACLE_HOME/rdbms/lib/bbed

LinkingBBEDutility(bbed)

rm-f/u01/app/oracle/10.2.0/db_1/rdbms/lib/bbed

gcc-o/u01/app/oracle/10.2.0/db_1/rdbms/lib/bbed-L/u01/app/oracle/10.2.0/db_1/rdbms/lib/-L/u01/app/oracle/10.2.0/db_1/lib/-L/u01/app/oracle/10.2.0/db_1/lib/stubs/-L/usr/lib-lirc/u01/app/oracle/10.2.0/db_1/lib/s0main.o/u01/app/oracle/10.2.0/db_1/rdbms/lib/ssbbded.o/u01/app/oracle/10.2.0/db_1/rdbms/lib/sbbdpt.o`cat/u01/app/oracle/10.2.0/db_1/lib/ldflags`-lnsslb10-lncrypt10-lnsgr10-lnzjs10-ln10-lnnz10-lnl10/u01/app/oracle/10.2.0/db_1/rdbms/lib/defopt.o-ldbtools10-lclntsh`cat/u01/app/oracle/10.2.0/db_1/lib/ldflags`-lnsslb10-lncrypt10-lnsgr10-lnzjs10-ln10-lnnz10-lnl10-lnro10`cat/u01/app/oracle/10.2.0/db_1/lib/ldflags`-lnsslb10-lncrypt10-lnsgr10-lnzjs10-ln10-lnnz10-lnl10-lclient10-lnnetd10-lvsn10-lcommon10-lgeneric10-lmm-lsnls10-lnls10-lcore10-lsnls10-lnls10-lcore10-lsnls10-lnls10-lxml10-lcore10-lunls10-lsnls10-lnls10-lcore10-lnls10`cat/u01/app/oracle/10.2.0/db_1/lib/ldflags`-lnsslb10-lncrypt10-lnsgr10-lnzjs10-ln10-lnnz10-lnl10-lnro10`cat/u01/app/oracle/10.2.0/db_1/lib/ldflags`-lnsslb10-lncrypt10-lnsgr10-lnzjs10-ln10-lnnz10-lnl10-lclient10-lnnetd10-lvsn10-lcommon10-lgeneric10-lsnls10-lnls10-lcore10-lsnls10-lnls10-lcore10-lsnls10-lnls10-lxml10-lcore10-lunls10-lsnls10-lnls10-lcore10-lnls10-lclient10-lnnetd10-lvsn10-lcommon10-lgeneric10-lsnls10-lnls10-lcore10-lsnls10-lnls10-lcore10-lsnls10-lnls10-lxml10-lcore10-lunls10-lsnls10-lnls10-lcore10-lnls10`cat/u01/app/oracle/10.2.0/db_1/lib/sysliblist`-Wl,-rpath,/u01/app/oracle/10.2.0/db_1/lib-lm`cat/u01/app/oracle/10.2.0/db_1/lib/sysliblist`-ldl-lm-L/u01/app/oracle/10.2.0/db_1/lib

Oracle11g中缺省不提供BBET库文件,如果需要可以将10g中的文件copy到11g相应目录再执行安装:

$ORACLE_HOME/rdbms/lib/ssbbded.o

$ORACLE_HOME/rdbms/lib/sbbdpt.o
$ORACLE_HOME/rdbms/mesg/bbedus.msb

$ORACLE_HOME/rdbms/mesg/bbedus.msg

在第一次使用时会发现有默认的口令,从这里可以看出oracle对bbed工具的限制,默认的密码是blockedit

[oracle@node1~]$cd$ORACLE_HOME/rdbms/lib

[oracle@node1lib]$./bbed

Password:

BBED:Release2.0.0.0.0-LimitedProductiononThuJul1016:09:572014

Copyright(c)1982,2005,Oracle.Allrightsreserved.

*************!!!ForOracleInternalUseonly!!!***************

查看一下bbed命令

BBED>helpall

SETDBA[dba|file#,block#]

SETFILENAME'filename'

SETFILEfile#

SETBLOCK[+/-]block#

SETOFFSET[[+/-]byteoffset|symbol|*symbol]

SETBLOCKSIZEbytes

SETLIST[FILE]'filename'

SETWIDTHcharacter_count

SETCOUNTbytes_to_display

SETIBASE[HEX|OCT|DEC]

SETOBASE[HEX|OCT|DEC]

SETMODE[BROWSE|EDIT]

SETSPOOL[Y|N]

SHOW[<SETparameter>|ALL]

INFO

MAP[/v][DBA|FILENAME|FILE|BLOCK]

DUMP[/v][DBA|FILENAME|FILE|BLOCK|OFFSET|COUNT]

PRINT[/x|d|u|o|c][DBA|FILE|FILENAME|BLOCK|OFFSET|symbol|*symbol]

EXAMINE[/Nuf][DBA|FILE|FILENAME|BLOCK|OFFSET|symbol|*symbol]

</Nuf>:

N-anumberwhichspecifiesarepeatcount.

u-aletterwhichspecifiesaunitsize:

b-b1,ub1(byte)

h-b2,ub2(half-word)

w-b4,ub4(word)

r-Oracletable/indexrow

f-aletterwhichspecifiesadisplayformat:

x-hexadecimal

d-decimal

u-unsigneddecimal

o-octal

c-character(native)

n-Oraclenumber

t-Oracledate

i-Oraclerowid

FIND[/x|d|u|o|c]numeric/characterstring[TOP|CURR]

COPY[DBA|FILE|FILENAME|BLOCK]TO[DBA|FILE|FILENAME|BLOCK]

MODIFY[/x|d|u|o|c]numeric/characterstring

[DBA|FILE|FILENAME|BLOCK|OFFSET|symbol|*symbol]

ASSIGN[/x|d|u|o]<targetspec>=<sourcespec>

<targetspec>:[DBA|FILE|FILENAME|BLOCK|OFFSET|symbol|*symbol]

<sourcespec>:[value|<targetspecoptions>]

SUM[DBA|FILE|FILENAME|BLOCK][APPLY]

PUSH[DBA|FILE|FILENAME|BLOCK|OFFSET]

POP[ALL]

REVERT[DBA|FILE|FILENAME|BLOCK]

UNDO

HELP[<bbedcommand>|ALL]

VERIFY[DBA|FILE|FILENAME|BLOCK]

CORRUPT[DBA|FILE|FILENAME|BLOCK]

set设定当前的环境

show查看当前的环境参数,跟sqlplus的同名命令类似。

dump列出指定block的内容

find在指定的block中查找指定的字符串,结果是显示出字符串,及其偏移量--offset,偏移量就是在block中的字节数

modify修改指定block的指定偏移量的值,可以在线修改。

copy把一个block的内容copy到另一个block中

verify检查当前环境是否有坏块

sum计算block的checksum,modify之后block就被标识为坏块,currentchecksum与reqiredchecksum不一致,sum命令可以计算出新的checksum并应用到当前块。

undo回滚当前的修改操作,如果手误做错了,undo一下就ok了,回到原来的状态。

revert回滚所有之前的修改操作,意思就是undoall

为bbed配置一个参数文本

制作bbed列表

SQL>setheadingoff;

SQL>setfeedbackoff;

SQL>spool/u01/bbedlist.parf

SQL>selectfile#||''||name||''||bytesfromv$datafile;

1/u01/app/oracle/oradata/orcl_dup/system01.dbf524288000

3/u01/app/oracle/oradata/orcl_dup/sysaux01.dbf346030080

4/u01/app/oracle/oradata/orcl_dup/users01.dbf191365120

5/u01/app/oracle/oradata/orcl_dup/example01.dbf104857600

6/u01/app/oracle/oradata/orcl_dup/tts01.dbf20971520

7/u01/app/oracle/oradata/orcl_dup/tts02.dbf20971520

8/u01/app/oracle/oradata/orcl_dup/undotbs001.dbf104857600

SQL>spooloff;

SQL>setheadingon;

SQL>setfeedbackon;

制作parfile

[oracle@node1lib]$vi/u01/bbed.par

blocksize=8192

listfile=/u01/bbedlist.parf

mode=edit

用parfile启动bbed

[oracle@node1lib]$./bbedparfile=/u01/bbed.parpassword=blockedit

BBED:Release2.0.0.0.0-LimitedProductiononThuJul1016:42:272014

Copyright(c)1982,2005,Oracle.Allrightsreserved.

*************!!!ForOracleInternalUseonly!!!***************

BBED>show

FILE#1

BLOCK#1

OFFSET0

DBA0x00400001(41943051,1)

FILENAME/u01/app/oracle/oradata/orcl_dup/system01.dbf

BIFILEbifile.bbd

LISTFILE/u01/bbedlist.parf

BLOCKSIZE8192

MODEEdit

EDITUnrecoverable

IBASEDec

OBASEDec

WIDTH80

COUNT512

LOGFILElog.bbd

SPOOLNo

通过bbed获取指定数值的RDBA(RelativeDataBlockAddress)

SQL>select*frombbed_test;

JOB

-------------------------

123456

1234567890

2rowsselected.

SQL>select

2rowid,

3dbms_rowid.rowid_relative_fno(rowid)rel_fno,

4dbms_rowid.rowid_block_number(rowid)blockno,

5dbms_rowid.rowid_row_number(rowid)rowno

6frombbed_test;

ROWIDREL_FNOBLOCKNOROWNO

------------------------------------------------

AAAN9GAAEAAAAK0AAA46920

AAAN9GAAEAAAAK0AAB46921

2rowsselected.

BBED>setdba4,692offset0

DBA0x010002b4(167779084,692)

OFFSET0

BBED>show

FILE#4

BLOCK#692

OFFSET8168

DBA0x010002b4(167779084,692)

FILENAME/u01/app/oracle/oradata/orcl_dup/users01.dbf

BIFILEbifile.bbd

LISTFILE/u01/bbedlist.parf

BLOCKSIZE8192

MODEEdit

EDITUnrecoverable

IBASEDec

OBASEDec

WIDTH80

COUNT512

LOGFILElog.bbd

SPOOLNo

当然数据库中通过dbms_utility包也很容易就能获得,此处可以对比一下

SQL>variableget_rdbavarchar2(30);

SQL>exec:dba:=dbms_utility.make_data_block_address(4,692);

PL/SQLproceduresuccessfullycompleted.

SQL>printdba

DBA

--------------------------------

16777908