一、BBED简介:
BBED(Oracle Block Browerand EDitor Tool),用来直接查看和修改数据文件数据的一个工具,是Oracle一款内部工具,可以直接修改Oracle数据文件块的内容,在一些极端恢复场景下比较有用。该工具不受Oracle支持,所以默认是没有生成可执行文件的,在使用前需要重新连接。
二、BBED的编译和安装
本文特指在linux环境中编译安装,在windows中是没有的。
在9i或10g中直接编译生成
[oracle@Oracle10g ~]$ cd /u01/app/oracle/product/10.2.0/db_1/rdbms
[oracle@Oracle10g lib]$ make -f ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed
查看生成bbed
[oracle@Oracle10g lib]$ ls
bbed kecwr.o libqsmashr.a skfodpt.o
config.c kfod.o libskgxns.a skrmpt.o
config.o kgupc.o libskgxpd.a skrnpt.o
cursize.o kgutc.o libskgxpg.a skrspt.o
dbfsize.o kkpoban.o libskgxpr.a sllfls.o
defopt.o kkxntp.o libskgxpu.a srfsd.o
dmndm.o kkxwtp.o libxdb.a ssbbded.o
dmndmse.o kopc.o mapsga.o sskfeded.o
其他文件略
以上生成的BBED可执行文件在¥ORACLE_HOME/rdbms/lib目录中,可以复制到其他位置或者其他不同的Oracle版本的机器上运行。
也可以通过以下命令将bbed生成到$ORACLE_HOME/bin目录(注意和直接编译生成的不同)
[oracle@Oracle10g lib]$ make -f ins_rdbms.mk BBED=$ORACLE_HOME/bin/bbed $ORACLE_HOME/bin/bbed
由于Oracle Database 11g中没有提供BBED库文件,但是可以用10g的文件编译出来,需要先从10g中复制如下文件到相应目录,然后再执行上述命令,参考如下步骤:
(1)复制Oracle10g文件(注意目录不同)
Copy $ORA10g_HOME/rdbms/lib/ssbbded.o to$ORA11g_HOME/rdbms/lib
Copy $ORA10g_HOME/rdbms/lib/sbbdpt.o to $ORA11g_HOME/rdbms/lib
Copy $ORA10g_HOME/rdbms/mesg/bbedus.msb to $ORA11g_HOME/rdbms/mesg
Copy $ORA10g_HOME/rdbms/mesg/bbedus.msg to $ORA11g_HOME/rdbms/mesg
Copy $ORA10g_HOME/rdbms/mesg/bbedar.msb to $ORA11g_HOME/rdbms/mesg
(2)编译
[oracle@Oracle11gR2 lib]$ make -f ins_rdbms.mk BBED=$ORACLE_HOME/bin/bbed $ORACLE_HOME/bin/bbed
2.使用BBED
BBED是Oracle内部使用的命令,默认密码是blockedit
[oracle@Oracle11gR2 lib]$ bbed
Password: (blockedit)
BBED: Release 2.0.0.0.0 - Limited Production on Sat Apr 9 08:36:43 2016
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
************* !!! For Oracle Internal Use only !!! ***************
BBED>
相关参数可以使用help进行查看:
BBED> help all
SET DBA [ dba | file#, block# ]
SET FILENAME 'filename'
SET FILE file#
SET BLOCK [+/-]block#
SET OFFSET [ [+/-]byte offset | symbol | *symbol ]
SET BLOCKSIZE bytes
SET LIST[FILE] 'filename'
SET WIDTH character_count
SET COUNT bytes_to_display
SET IBASE [ HEX | OCT | DEC ]
SET OBASE [ HEX | OCT | DEC ]
SET MODE [ BROWSE | EDIT ]
SET SPOOL [ Y | N ]
SHOW [ <SET parameter> | 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 - a number which specifies a repeat count.
u - a letter which specifies a unit size:
b - b1, ub1 (byte)
h - b2, ub2 (half-word)
w - b4, ub4(word)
r - Oracle table/index row
f - a letter which specifies a display format:
x - hexadecimal
d - decimal
u - unsigned decimal
o - octal
c - character (native)
n - Oracle number
t - Oracle date
i - Oracle rowid
FIND[/x|d|u|o|c] numeric/character string [ TOP | CURR ]
COPY [ DBA | FILE | FILENAME | BLOCK ] TO [ DBA | FILE | FILENAME | BLOCK ]
MODIFY[/x|d|u|o|c] numeric/character string
[ DBA | FILE | FILENAME | BLOCK | OFFSET | symbol | *symbol ]
ASSIGN[/x|d|u|o] <target spec>=<source spec>
<target spec> : [ DBA | FILE | FILENAME | BLOCK | OFFSET | symbol | *symbol ]
<source spec> : [ value | <target spec options> ]
SUM [ DBA | FILE | FILENAME | BLOCK ] [ APPLY ]
PUSH [ DBA | FILE | FILENAME | BLOCK | OFFSET ]
POP [ALL]
REVERT [ DBA | FILE | FILENAME | BLOCK ]
UNDO
HELP [ <bbed command> | 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就被标识为坏块,current checksum与reqired checksum不一致,sum命令可以计算出新的checksum并应用到当前块。
undo 回滚当前的修改操作,如果手误做错了,undo一下就ok了,回到原来的状态。
revert 回滚所有之前的修改操作,意思就是 undo all
三、set命令:1)设置listfile
BBED> set listfile '/home/oracle/bbed.list'
BBED-00300: unable to translate filename(报错是正常的,可以通过show all查看配置)
2)设置filename
BBED> set filename '/u01/app/oracle/oradata/test.dbf'
FILENAME /u01/app/oracle/oradata/test.dbf
3)设置BLOCK(通过rowid获取)
BBED> set BLOCK 135
BLOCK# 135
4)设置count
BBED> set count 8192
COUNT 8192
5)设置file(通过rowid获取)
BBED> set file 5
FILE# 5
6)通过show all查看BBED配置
BBED> show all
FILE# 0
BLOCK# 135
OFFSET 0
DBA 0x00000000 (0 0,135)
FILENAME /u01/app/oracle/oradata/test.dbf
BIFILE bifile.bbd
LISTFILE /home/oracle/bbed.list
BLOCKSIZE 8192
MODE Browse
EDIT Unrecoverable
IBASE Dec
OBASE Dec
WIDTH 80
COUNT 8192
LOGFILE log.bbd
SPOOL N
7)dump文件
BBED> dump
File: /u01/app/oracle/oradata/test.dbf (5)
Block: 135 Offsets: 0 to 8191 Dba:0x01400087
------------------------------------------------------------------------
06a20000 87004001 d5850400 00000406 80a40000 01000000 bd350000 38710400
00000000 02003200 80004001 09001200 de000000 4b59c000 26003200 03200000
d5850400 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00010300 ffff1800 711f591f 591f0000 03008b1f 7e1f711f 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
………………中间略……………………
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 002c0102 02c10406 43434343
43432c01 0202c103 06424242 4242422c 010202c1 02064141 41414141 0406d585