这里我们简单介绍下Oracle bbed工具。bbed是Block Browser and Editor(块浏览编辑器)的缩写,它是Oracle数据库在安装时一起附带的工具。一般此工具倾向于仅作为Oracle内部使用,且Oracle公司并不公开此工具使用细节。由于bbed可以对Oracle数据库中的数据块进行内容修改和破坏,因此此工具功能强大同时伴有很高的使用风险。
如果你需要使用此工具,你需要自己为此所带来的风险负责。通过此工具进行的任何修改都不会受到Oracle的官方支持。
在bbed使用前,它需要进行编译连接。其相关代码已经在Oracle数据库安装时一起部署好了,不过它并未和安装执行文件进行关联。在进行Link操作时,你需要转到rdbms/install目录下并执行以下命令:
[oracle@RDBALINUX03 oracle]$ cd $ORACLE_HOME/rdbms/lib
[oracle@RDBALINUX03 lib]$ make -f ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed
Linking BBED utility (bbed)
rm -f /home/oracle/Ora92/rdbms/lib/bbed
gcc -o /home/oracle/Ora92/rdbms/lib/bbed -L/home/oracle/Ora92/rdbms/lib/ -
L/home/oracle/Ora92/lib -L/home/oracle/Ora92/lib/stubs/ /home/oracle/Ora92/lib/s0main.o
/home/oracle/Ora92/rdbms/lib/ssbbed.o /home/oracle/Ora92/rdbms/lib/sbbdpt.o `cat
注意,11g中缺失几个相关文件,但我们实际可以从10g拷贝相关文件到11g对应目录下:
$ORACLE_HOME/rdbms/lib/sbbdpt.o
$ORACLE_HOME/rdbms/lib/ssbbded.o
$ORACLE_HOME/rdbms/mesg/bbedus.msb
$ORACLE_HOME/rdbms/mesg/bbedus.msg
你可以通过使用ls命令来查看bbed是否已经连接上了。
[oracle@RDBALINUX03 lib]$ ls -al $ORACLE_HOME/rdbms/lib/bbed
-rwxrwxr-x 1 oracle oracle 321165 Sep 19 09:10 /home/oracle/Ora92/rdbms/lib/bbed
[oracle@RDBALINUX03 lib]$
默认,bbed工具是被编译连接到rdbms/lib目录下的。因此并不是在通常的$ORACLE_HOME/bin目录。你可以将被连接的可执行文件移到bin目录下,或者直接在rdbms/lib目录中启动它。
[oracle@RDBALINUX03 bin]$ bbed
Password: ******
BBED: Release 2.0.0.0.0 - Limited Production on Mon Sep 19 10:00:27 2005
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
************* !!! For Oracle Internal Use only !!! ***************
BBED>
下表中显示了可用的命令项:
命令项 | 描述 |
BLOCKSIZE | 可编辑的数据文件标准块大小。 |
MODE | bbed可运行模式(browser或edit) |
SILENT | 不将输出打印到标准输出上(Y或N) |
SPOOL | 操作记录写出到bbed.log文件 (Y或N) |
LISTFILE | 列出可编辑的文件 |
CMDFILE | 可执行命令的文件名清单 |
BIFILE | undo文件文件名。默认为bifile.bbd |
LOGFILE | 用户日志文件文件名。默认为log.bbd |
PARFILE | 列有命令项的参数文件 |
由于一些命令项经常执行时用到,因此建议可以使用parfile来将一般使用的命令项都存放在参数文件中。
下面是一个bbed parfile的命令项设置(针对的是8Kbk块的小数据库)
[oracle@pd bbed]$ cat bbed.par
blocksize=8192
listfile=/home/oracle/bbed/fileunix.log
mode=edit
例子中我们执行bbed时设置块大小为8Kb并设置bbed执行模式为edit,这样我们就能对块内容进行修改。我们也提供了可进行编辑的对象文件名在listfile指定的文件中。
在listfile中指定的文件中需要列出数据文件的文件id和文件字节大小:
[oracle@pd bbed]$ cat fileunix.log
1 /home/oracle/OraHome1/oradata/gctdev2/drsys01.dbf 20971520
2 /home/oracle/OraHome1/oradata/gctdev2/example01.dbf 125829120
3 /home/oracle/OraHome1/oradata/gctdev2/indx01.dbf 26214400
4 /home/oracle/OraHome1/oradata/gctdev2/system01.dbf 335544320
5 /home/oracle/OraHome1/oradata/gctdev2/tools01.dbf 10485760
6 /home/oracle/OraHome1/oradata/gctdev2/undotbs01.dbf 246415360
7 /home/oracle/OraHome1/oradata/gctdev2/user01.dbf 26214400
8 /home/oracle/OraHome1/oradata/gctdev2/xdb01.dbf 39976960
你也可以使用以下数据库查询语句来生成listfile内容:
SQL> select file#||' '||name||' '||bytes from v$datafile;
更多BBED使用,可查阅 http://orafaq.com/papers/dissassembling_the_data_block.pdf