11gR2 BBED 编译安装

bbed用来做什么

做测试的时候、学习oracle块原理的时候,如果能有一个工具直接在块级别读取和操作数据的话是不是很方便呢,而BBED就是这样的一个工具,通过BBED你可以做到什么?

  • 更改数据
  • 恢复受损的或删除的数据
  • 修改文件头
  • 损坏块并修复坏块

删除一个行,但需要将其恢复?当您或用户删除数据时,数据怎么了?具体来说,数据真的丢了,还是发生了别的事?答案是发生了别的事。 Oracle将该行(或几行)标记为删除,以制造可用空间供将来使用。例如,在DOS中使用文件,当一个文件被删除时,文件名的第一个字符被改变,文件隐藏到正常的”目录”列表。恢复工具可以用来显示已删除的文件。你唯一的工作就是找出丢失的第一个字符。 在Oracle中使用 BBED恢复数据与此事大致相同 – 你只需要找到删除的行的位置,并重设一些标志,使该行再度活跃(假设该行还没有被覆盖)。

在更大的规模上,同样类型的恢复可以使用数据文件来完成。在文件头(文件头块)的内部设置值,可以使旧文件成为当前数据库的一部分。

该BBED工具可以让你有能力损坏块,并修复坏块(重设损坏块标记)。为此目的使用BBED,虽然有趣但不实际,因为有更好的(即,更成熟的,获批准的)方法来修复损坏块。但是,如果你想损坏块并检测你的RMAN技能,这将是一个相当快的方法来设置该实验室环境。

所有上述的一切无需访问数据库进行登录或具有活性实例运行 (除了RMAN恢复)就可以完成。换句话说,如果有人访问BBED并访问你的数据文件,这个人可以访问你数据库中的一切、一切。如果这还没能说服你保护你的Oracle数据文件,禁止未经授权的用户,你还要怎样呢?

安装 bbed

Oracle 11G下安装BBED,需要从ORACLE 10G中复制三个包 sbbdpt.o 、ssbbded.o 并将两个文件移到$ORACLE_HOME/rdbms/lib/ 目录下 , bbedus.msb 移到 $ORACLE_HOME/rdbms/mesg/ 下面

可以通过我的链接下载bbed.rar

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[oracle@xb lib]$ ll *bb*
-rw-r--r--. 1 oracle oinstall 1863 Oct 23 16:09 sbbdpt.o
-rw-r--r--. 1 oracle oinstall 1191 Oct 23 16:09 ssbbded.o

[oracle@xb mesg]$ ll bb*
-rw-r--r--. 1 oracle oinstall 8704 Oct 23 16:14 bbedus.msb

[oracle@xb bin]$ cd /u01/app/oracle/product/11.2.0/dbhome_1/rdbms/lib/
[oracle@xb lib]$ make -f ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed

Linking BBED utility (bbed)
rm -f /u01/app/oracle/product/11.2.0/dbhome_1/rdbms/lib/bbed
gcc -o /u01/app/oracle/product/11.2.0/dbhome_1/rdbms/lib/bbed -m64 -z noexecstack -L/u01/app/oracle/product/11.2.0/dbhome_1/rdbms/lib/ -L/u01/app/oracle/product/11.2.0/dbhome_1/lib/ -L/u01/app/oracle/product/11
.2.0/dbhome_1/lib/stubs/ /u01/app/oracle/product/11.2.0/dbhome_1/lib/s0main.o /u01/app/oracle/product/11.2.0/dbhome_1/rdbms/lib/ssbbded.o /u01/app/oracle/product/11.2.0/dbhome_1/rdbms/lib/sbbdpt.o `cat /u01/app/oracle/product/11.2.0/dbhome_1/lib/ldflags` -lncrypt11 -lnsgr11 -lnzjs11 -ln11 -lnl11 -ldbtools11 -lclntsh `cat /u01/app/oracle/product/11.2.0/dbhome_1/lib/ldflags` -lncrypt11 -lnsgr11 -lnzjs11 -ln11 -lnl11 -lnro11 `cat /u01/app/oracle/product/11.2.0/dbhome_1/lib/ldflags` -lncrypt11 -lnsgr11 -lnzjs11 -ln11 -lnl11 -lnnz11 -lzt11 -lztkg11 -lclient11 -lnnetd11 -lvsn11 -lcommon11 -lgeneric11 -lmm -lsnls11 -lnls11 -lcore11 -lsnls11 -lnls11 -lcore11 -lsnls11 -lnls11 -lxml11 -lcore11 -lunls11 -lsnls11 -lnls11 -lcore11 -lnls11 `cat /u01/app/oracle/product/11.2.0/dbhome_1/lib/ldflags` -lncrypt11 -lnsgr11 -lnzjs11 -ln11 -lnl11 -lnro11 `cat /u01/app/oracle/product/11.2.0/dbhome_1/lib/ldflags` -lncrypt11 -lnsgr11 -lnzjs11 -ln11 -lnl11 -lclient11 -lnnetd11 -lvsn11 -lcommon11 -lgeneric11 -lsnls11 -lnls11 -lcore11 -lsnls11 -lnls11 -lcore11 -lsnls11 -lnls11 -lxml11 -lcore11 -lunls11 -lsnls11 -lnls11 -lcore11 -lnls11 -lclient11 -lnnetd11 -lvsn11 -lcommon11 -lgeneric11 -lsnls11 -lnls11 -lcore11 -lsnls11 -lnls11 -lcore11 -lsnls11 -lnls11 -lxml11 -lcore11 -lunls11 -lsnls11 -lnls11 -lcore11 -lnls11 `cat /u01/app/oracle/product/11.2.0/dbhome_1/lib/sysliblist` -Wl,-rpath,/u01/app/oracle/product/11.2.0/dbhome_1/lib -lm `cat /u01/app/oracle/product/11.2.0/dbhome_1/lib/sysliblist` -ldl -lm -L/u01/app/oracle/product/11.2.0/dbhome_1/lib[oracle@xb lib]$ mv bbed $ORACLE_HOME/bin/
[oracle@xb lib]$ bbed
Password: >>>>====默认密码是:blockedit

BBED: Release 2.0.0.0.0 - Limited Production on 星期二 10月 23 16:21:41 2018

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

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

BBED>

简单使用方法

为了简便使用,可以设置par参数文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[oracle@xb ~]$ bbed parfile=bbed.par 

BBED: Release 2.0.0.0.0 - Limited Production on 星期二 10月 23 16:26:04 2018

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

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

BBED> quit

[oracle@xb ~]$ cat bbed.par
mode=edit
password=blockedit
blocksize=8192

相关参数查看

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[oracle@xb ~]$ 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]

开始运行BBED前,大概了解数据块周围的路径是很有用的,包括如何在一个表中由行获得内部块的信息。这个以及其他必要信息,通常包括绝对文件号,完整路径和数据文件的名称,块中数据文件的大小,数据块地址,块编号,块大小和块类型等信息。

你需要一个报告工具输出有关块的信息。不止一种方法可以得到这个信息,但最简单的是基于使用内置的名为DBMS_ROWID所提供的PL/SQL

1
2
3
4
5
6
7
8
DBMS_ROWID.ROWID_INFO (
rowid_in IN ROWID,
ts_type_in IN VARCHAR2 DEFAULT 'SMALLFILE',
rowid_type OUT NUMBER,
object_number OUT NUMBER,
relative_fno OUT NUMBER,
block_number OUT NUMBER,
row_number OUT NUMBER);

通过dbms_rowid包来获取块信息,get_rowinfo示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
create or replace procedure get_rowinfo(rid in rowid) as
sm varchar2(9) := 'SMALLFILE';
rid_t number;
obj_n number;
file_n number;
block_n number;
row_n number;
begin
DBMS_ROWID.ROWID_INFO(rid, rid_t, obj_n, file_n, block_n, row_n, sm);
DBMS_OUTPUT.PUT_LINE('Type: ' || to_char(rid_t));
DBMS_OUTPUT.PUT_LINE('Data obj number: ' || to_char(obj_n));
DBMS_OUTPUT.PUT_LINE('Relative fno: ' || to_char(file_n));
DBMS_OUTPUT.PUT_LINE('Block number: ' || to_char(block_n));
DBMS_OUTPUT.PUT_LINE('Row number: ' || to_char(row_n));
end;
/

SYS@xb> select rowid from xb_corrupt where rownum=1;

ROWID
------------------
AAAVdAAAFAAAACDAAA

SYS@xb> exec get_rowinfo('AAAVdAAAFAAAACDAAA');
Type: 1
Data obj number: 87872
Relative fno: 5
Block number: 131
Row number: 0

PL/SQL 过程已成功完成。

11gR2 BBED 编译安装
https://www.xbdba.com/2018/10/28/11g-bbed-install/
作者
xbdba
发布于
2018年10月28日
许可协议