一. BBED介绍
The name bbed is an acronym for Block Browser and EDitor and it is shipped with the database. It is intended for Oracle internal use only and the company never publishes any details about it. It is a very powerful tool but also extremely dangerous since it can change and/or corrupt data blocks of any Oracle database. If you use this tool, you do so at your own risk. Any modifications made with this tool render the database unsupported by Oracle.
BBED(Oracle Block Browerand EDitor Tool),用来直接查看和修改数据文件数据的一个工具,是Oracle一款内部工具,可以直接修改Oracle数据文件块的内容,在一些极端恢复场景下比较有用。BBED是非Oracle推荐使用的工具,只提供给内部进行恢复处理使用,对外是不提供任何资料和相关技术支持,默认BBED在Oracle内部没有提供编译好的现成版本,需要我们手工性编译。
所以,我们如果计划使用该工具,特别是在生产环境下使用,都是我们的最后选择方案。一定要在有备份能恢复的时候进行使用,否则贸然使用BBED,容易造成数据库启动失败或者更严重的问题。
二. BBED安装
在linux上面有,需要编译。
在9i/10g中直接编译生成bbed:
cd $ORACLE_HOME/rdbms/lib
make -f ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed
示例:
[oracle@db2 ~]$ cd $ORACLE_HOME/rdbms/lib
[oracle@db2 lib]$ make -f ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed
Linking BBED utility (bbed)
rm -f /u01/app/oracle/product/10.2.0/db_1/rdbms/lib/bbed
gcc -o/u01/app/oracle/product/10.2.0/db_1/rdbms/lib/bbed-L/u01/app/oracle/product/10.2.0/db_1/rdbms/lib/-L/u01/app/oracle/product/10.2.0/db_1/lib/-L/u01/app/oracle/product/10.2.0/db_1/lib/stubs/ -L/usr/lib -lirc /u01/app/oracle/product/10.2.0/db_1/lib/s0main.o/u01/app/oracle/product/10.2.0/db_1/rdbms/lib/ssbbded.o/u01/app/oracle/product/10.2.0/db_1/rdbms/lib/sbbdpt.
cat/u01/app/oracle/product/10.2.0/db_1/lib/sysliblist`-Wl,-rpath,/u01/app/oracle/product/10.2.0/db_1/lib -lm `cat /u01/app/oracle/product/10.2.0/db_1/lib/sysliblist`-ldl -lm -L/u01/app/oracle/product/10.2.0/db_1/lib ......
[oracle@db2 lib]$
以上生成的bbed可执行文件在$ORACLE_HOME/rdbms/lib目录,可以复制到其他位置或者其他同Oracle版本的机器上运行。也可通过以下命令将bbed生成到$ORACLE_HOME/bin目录.
[oracle@db2 lib]$ make -f ins_rdbms.mk BBED=$ORACLE_HOME/bin/bbed $ORACLE_HOME/bin/bbed
Linking BBED utility (bbed)
rm -f /u01/app/oracle/product/10.2.0/db_1/bin/bbed
gcc -o/u01/app/oracle/product/10.2.0/db_1/bin/bbed-L/u01/app/oracle/product/10.2.0/db_1/rdbms/lib/-L/u01/app/oracle/product/10.2.0/db_1/lib/-L/u01/app/oracle/product/10.2.0/db_1/lib/stubs/ -L/usr/lib -lirc /u01/app/oracle/product/10.2.0/db_1/lib/s0main.o/u01/app/oracle/product/10.2.0/db_1/rdbms/lib/ssbbded.o/u01/app/oracle/product/10.2.0/db_1/rdbms/lib/sbbdpt.o `cat/u01/app/oracle/product/10.2.0/db_1/lib/ldflags` -lnsslb10 -lncrypt10 -lnsgr10 -lnzjs10-ln10 -lnnz10 -lnl10 /u01/app/oracle/product/10.2.0/db_1/rdbms/lib/defopt.o-ldbtools10 -lclntsh ......
[oracle@db2 ~]$ cd $ORACLE_HOME/rdbms/lib
[oracle@db2 lib]$ ls -lrt bbed
-rwxr-xr-x 1 oracle oinstall 536161 Aug 1118:30 bbed
[oracle@db2 lib]$ cd $ORACLE_HOME/bin
[oracle@db2 lib]$ ls -lrt bbed
-rwxr-xr-x 1 oracle oinstall 536161 Aug 11 18:33bbed
OracleDatabase 11g中缺省未提供BBED库文件,但是可以用10g的文件编译出来,需要先从10g中复制如下文件到相应目录,然后再执行上述连接命令,参考如下步骤:
(1)复制Oracle 10g文件
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@db2 lib]$ make -f $ORA11g_HOME/rdbms/lib/ins_rdbms.mkBBED=$ORACLE_HOME/bin/bbed $ORACLE_HOME/bin/bbed
无论什么版本,编译后将$ORACLE_HOME/rdbms/lib添加到环境变量PATH中之后再使用bbed就可以直接运行。
三. BBED使用
初始化,配置bbed.par和filelist.txt文件
parameter file:参数文件中需要至少给定三个参数,分别是块大小、文件列表对应文件以及运行模式,mode有两种选择,browse和edit
[oracle@db2 ~]$ cat bbed.par
blocksize=8192
listfile=/home/oracle/filelist.txt
mode=edit
将datafile 的信息写入一个文件,格式为:文件编号 文件名字 文件大小,如下:
SYS@dave2(db2)> select file#||' '||name||' '||bytes from v$datafile ;
写入文件:
[oracle@db2 ~]$ cat files
1 /home/oracle/oradata/ora10g/system01.dbf 566239232
2 /home/oracle/oradata/ora10g/sysaux01.dbf 387981312
3 /home/oracle/oradata/ora10g/users01.dbf 120594432
4 /home/oracle/oradata/ora10g/info_01.dbf 5368717312
5 /home/oracle/oradata/ora10g/ts_biz01.dbf 1073750016
6 /home/oracle/oradata/ora10g/ts_bbs_01.dbf 1073750016
7 /home/oracle/oradata/ora10g/userdata01.dbf 209723392
这个id 我们也可以自己指定。当我们在bbed 里设置file id 时,就是根据这个参数文件中的的设置来的。 最好设置为相同,不然以后可能会混淆。
oracle@:/home/oracle> bbed help=y
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]
oracle@:/home/oracle> bbed parfile=bbed.par
Password:
BBED: Release 2.0.0.0.0 - Limited Production on Mon Jan 18 14:26:37 2016
Copyright (c) 1982, 2007, Oracle. All rights reserved.
************* !!! For Oracle Internal Use only !!! ***************
BBED> info
File# Name Size(blks)
----- ---- ----------
1 /home/oracle/oradata/ora10g/system01.dbf 69121
2 /home/oracle/oradata/ora10g/sysaux01.dbf 47361
3 /home/oracle/oradata/ora10g/users01.dbf 14721
4 /home/oracle/oradata/ora10g/info_01.dbf 131073
5 /home/oracle/oradata/ora10g/ts_biz01.dbf 131073
6 /home/oracle/oradata/ora10g/ts_bbs_01.dbf 131073
7 /home/oracle/oradata/ora10g/userdata01.dbf 25601
BBED> show
FILE# 1
BLOCK# 1
OFFSET 0
DBA 0x00400001 (4194305 1,1)
FILENAME /home/oracle/oradata/ora10g/system01.dbf
BIFILE bifile.bbd
LISTFILE /home/oracle/filelist.txt
BLOCKSIZE 8192
MODE Edit
EDIT Unrecoverable
IBASE Dec
OBASE Dec
WIDTH 80
COUNT 512
LOGFILE log.bbd
SPOOL No
BBED>
oracle@:/home/oracle$ bbed PASSWORD=blockedit LISTFILE=filelist.txt MODE=edit BLOCKSIZE=8192 (即可登录BBED)
BBED: Release 2.0.0.0.0 - Limited Production on Mon Jan 18 14:01:41 2016
Copyright (c) 1982, 2007, Oracle. All rights reserved.
************* !!! For Oracle Internal Use only !!! ***************
BBED>
也可以登录BBED后使用set命令来设置!
oracle@:/home/oracle/product/10.2.0/rdbms/lib> bbed
Password: --默认是blockedit
BBED: Release 2.0.0.0.0 - Limited Production on Mon Jan 18 10:43:32 2016
Copyright (c) 1982, 2007, Oracle. All rights reserved.
************* !!! For Oracle Internal Use only !!! ***************
BBED> set blocksize 8192
BLOCKSIZE 8192
BBED> set listfile '/home/oracle/filelist.txt' //注意,这里是单括号!
LISTFILE /home/oracle/filelist.txt
BBED> set width 200
WIDTH 200
BBED> set mode browse(浏览)
MODE Browse
BBED> set mode edit
MODE Edit
BBED>
BBED> info --显示在filelist中配置的可以查看或编辑的数据文件
File# Name Size(blks)
----- ---- ----------
1 /home/oracle/oradata/ora10g/system01.dbf 69121
2 /home/oracle/oradata/ora10g/sysaux01.dbf 47361
3 /home/oracle/oradata/ora10g/users01.dbf 14721
4 /home/oracle/oradata/ora10g/info_01.dbf 131073
5 /home/oracle/oradata/ora10g/ts_biz01.dbf 131073
6 /home/oracle/oradata/ora10g/ts_bbs_01.dbf 131073
7 /home/oracle/oradata/ora10g/userdata01.dbf 25601
BBED> set filename '/home/oracle/oradata/ora10g/info_01.dbf'
FILENAME /home/oracle/oradata/ora10g/info_01.dbf
BBED> set block 32
BLOCK# 32
BBED> set offset 20
OFFSET 20
FILE# 4
BLOCK# 32
OFFSET 20
DBA 0x01000020 (16777248 4,32)
FILENAME /home/oracle/oradata/ora10g/info_01.dbf
BIFILE bifile.bbd
LISTFILE /home/oracle/filelist.txt
BLOCKSIZE 8192
MODE Edit
EDIT Unrecoverable
IBASE Dec
OBASE Dec
WIDTH 200
COUNT 512
LOGFILE log.bbd
SPOOL No
四、BBED命令说明
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 [ | 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 ]
:
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] =
: [ DBA | FILE | FILENAME | BLOCK | OFFSET | symbol | *symbol ]
: [ value | ]
SUM [ DBA | FILE | FILENAME | BLOCK ] [ APPLY ]
PUSH [ DBA | FILE | FILENAME | BLOCK | OFFSET ]
POP [ALL]
REVERT [ DBA | FILE | FILENAME | BLOCK ]
UNDO
HELP [ | 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
1 set dba
SQL> select rowid,dbms_rowid.rowid_relative_fno(rowid) rel_fno,dbms_rowid.rowid_block_number(rowid) blockno,dbms_rowid.rowid_row_number(rowid) rowno
from EMP where rownum=1 ;
ROWID REL_FNO BLOCKNO ROWNO
------------------ ---------- ---------- ----------
AAAMlsAAEAAAAAgAAA 4 32 0
1 rows selected.
SQL> select dbms_utility.make_data_block_address(4,32) from dual;
DBMS_UTILITY.MAKE_DATA_BLOCK_ADDRESS(4,32)
------------------------------------------
16777248
在BBED中查找相关block信息,注意文件号必须是已经记录在filelist.txt中的。
BBED> set dba 4,32
DBA 0x01000020 (16777248 4,32)
设置file 1,block 60882,设置成功,会返回该block的RDBA (Relative Data Block Address),rdba就是rowid中的rfile#+block#。括号里面的是DBA值和block 和 file id。
2 set filename
BBED> set filename '/home/oracle/oradata/ora10g/info_01.dbf' //单括号引起来
FILENAME /home/oracle/oradata/ora10g/info_01.dbf
3 set file
BBED> set file 4
FILE# 4 -- 这里的number,是我们之前配置的filelist文件里的number。它可以和我们db 里的file id 不一样, 不过最好是配置一样的。
4 set block
BBED> set file 4
FILE# 4
BBED> set block 32
BLOCK# 32
BBED> set block +10
BLOCK# 42
BBED> set block -5
BLOCK# 37 --这里的block 是一个相对的位置,我们需要先指定一个file,然后在指定block。 即对应file里的block。可以对当前block的位置进行+和-操作。
5 set offset
BBED> set offset 20
OFFSET 20
BBED> set offset +2
OFFSET 22
BBED> set offset -2
OFFSET 20 --偏移量是相对某个block里的偏移量,可以用+和-进行操作
6 set blocksize
BBED> set blocksize 8192
BLOCKSIZE 8192 --设置当前datafile 的blocksize 大小,该大小必须和datafile 的实际block 匹配,否则会报错。
7 set listfile
BBED> set listfile '/home/oracle/filelist.txt'
LISTFILE /home/oracle/filelist.txt --对于listfile的文件,必须用单引号括起来。
8 set width
BBED> set width 200
WIDTH 200 --设定当前屏幕的宽度,默认是80.
9 set count
BBED> set count 512
COUNT 512 --设置dump 命令显示bytes的数量。默认是512 bytes
10 set modeBBED> set mode edit
MODE Edit
BBED> set mode browse
MODE Browse --设置bbed 的模式,该默认有2种:browse 和 edit。 browse 模式不允许进行修改。 如果要修改,就选择edit模式
show 命令
BBED> show
FILE# 1
BLOCK# 1
OFFSET 0
DBA 0x00400001 (4194305 1,1)
FILENAME /home/oracle/oradata/ora10g/system01.dbf
BIFILE bifile.bbd
LISTFILE /home/oracle/filelist.txt
BLOCKSIZE 8192
MODE Browse
EDIT Unrecoverable
IBASE Dec
OBASE Dec
WIDTH 200
COUNT 512
LOGFILE log.bbd
SPOOL No
info
BBED> info --显示当前可以进行browse 或者edit 的file。即我们filelist 里指定的datafile信息。File# Name Size(blks)
----- ---- ----------
1 /home/oracle/oradata/ora10g/system01.dbf 69121
2 /home/oracle/oradata/ora10g/sysaux01.dbf 47361
3 /home/oracle/oradata/ora10g/users01.dbf 14721
4 /home/oracle/oradata/ora10g/info_01.dbf 131073
5 /home/oracle/oradata/ora10g/ts_biz01.dbf 131073
6 /home/oracle/oradata/ora10g/ts_bbs_01.dbf 131073
7 /home/oracle/oradata/ora10g/userdata01.dbf 25601
Map
Map会通过偏移量来显示block里的详细信息,如block header,data block header 和row directory。 使用/v 选项,可以查看更详细的信息。
在不指定block的情况下,会显示当前block的信息,如果想显示其他block的信息,可以使用file name,file id,block 和DBA 来指定要显示的block。
BBED> map
File: /home/oracle/oradata/ora10g/info_01.dbf (4)
Block: 32 Dba:0x01000020
------------------------------------------------------------
KTB Data Block (Table/Cluster)
struct kcbh, 20 bytes @0
struct ktbbh, 72 bytes @20
struct kdbh, 14 bytes @100
struct kdbt[1], 4 bytes @114
sb2 kdbr[140] @118
ub1 freespace[844] @398
ub1 rowdata[6946] @1242
ub4 tailchk @8188 // @后面代表的对应的信息在block里的偏移量,即offset。
BBED> map /v dba 4,32 --通过dba 来指定某个block
File: /home/oracle/oradata/ora10g/info_01.dbf (4)
Block: 32 Dba:0x01000020
------------------------------------------------------------
KTB Data Block (Table/Cluster)
struct kcbh, 20 bytes @0
ub1 type_kcbh @0
ub1 frmt_kcbh @1
ub1 spare1_kcbh @2
ub1 spare2_kcbh @3
ub4 rdba_kcbh @4
ub4 bas_kcbh @8
ub2 wrp_kcbh @12
ub1 seq_kcbh @14
ub1 flg_kcbh @15
ub2 chkval_kcbh @16
ub2 spare3_kcbh @18
struct ktbbh, 72 bytes @20
ub1 ktbbhtyp @20
union ktbbhsid, 4 bytes @24
struct ktbbhcsc, 8 bytes @28
b2 ktbbhict @36
ub1 ktbbhflg @38
ub1 ktbbhfsl @39
ub4 ktbbhfnx @40
struct ktbbhitl[2], 48 bytes @44
struct kdbh, 14 bytes @100
ub1 kdbhflag @100
b1 kdbhntab @101
b2 kdbhnrow @102
sb2 kdbhfrre @104
sb2 kdbhfsbo @106
sb2 kdbhfseo @108
b2 kdbhavsp @110
b2 kdbhtosp @112
struct kdbt[1], 4 bytes @114
b2 kdbtoffs @114
b2 kdbtnrow @116
sb2 kdbr[140] @118
ub1 freespace[844] @398
ub1 rowdata[6946] @1242
ub4 tailchk @8188
BBED>
BBED> map block 32 --通过block 来map
File: /home/oracle/oradata/ora10g/info_01.dbf (4)
Block: 32 Dba:0x01000020
------------------------------------------------------------
KTB Data Block (Table/Cluster)
stuct kcbh, 20 bytes @0
struct ktbbh, 72 bytes @20
struct kdbh, 14 bytes @100
struct kdbt[1], 4 bytes @114
sb2 kdbr[140] @118
ub1 freespace[844] @398
ub1 rowdata[6946] @1242
ub4 tailchk @8188