如果自己搞不定可以找诗檀软件专业ORACLE数据库修复团队成员帮您恢复!
诗檀软件专业数据库修复团队
服务热线 : 13764045638 QQ号:47079569 邮箱:[email protected]
如果你能在块级直接读取并操作数据会怎样? Oracle提供这样一个工具能做到这些,但你必须自己建立它。块浏览器和编辑器工具,简称BBED,是你在Oracle数据库内读取数据块内容的通行证。你可以用BBED做什么? 你可以:
- 更改数据
- 恢复受损的或删除的数据
- 修改文件头
- 损坏块并修复坏块
修改数据的能力就是听起来这样的。你可以在任何地方更改任何数据。这意味着什么?这也意味着你可以更改密码- 任何密码。例如,您可以更改sys的口令。
删除一个行,但需要将其恢复?当您或用户删除数据时,数据怎么了?具体来说,数据真的丢了,还是发生了别的事?答案是发生了别的事。 Oracle将该行(或几行)标记为删除,以制造可用空间供将来使用。例如,在DOS中使用文件,当一个文件被删除时,文件名的第一个字符被改变,文件隐藏到正常的“目录”列表。恢复工具可以用来显示已删除的文件。你唯一的工作就是找出丢失的第一个字符。 在Oracle中使用 BBED恢复数据与此事大致相同 – 你只需要找到删除的行的位置,并重设一些标志,使该行再度活跃(假设该行还没有被覆盖)。
在更大的规模上,同样类型的恢复可以使用数据文件来完成。在文件头(文件头块)的内部设置值,可以使旧文件成为当前数据库的一部分。
该BBED工具可以让你有能力损坏块,并修复坏块(重设损坏块标记)。为此目的使用BBED,虽然有趣但不实际,因为有更好的(即,更成熟的,获批准的)方法来修复损坏块。但是,如果你想损坏块并检测你的RMAN技能,这将是一个相当快的方法来设置该实验室环境。
所有上述的一切无需访问数据库进行登录或具有活性实例运行 (除了RMAN恢复)就可以完成。换句话说,如果有人访问BBED并访问你的数据文件,这个人可以访问你数据库中的一切。 一切。如果这还没能说服你保护你的Oracle数据文件,禁止未经授权的用户,你还要怎样呢?
安装 bbed
你是在哪里,怎样得到BBED的?在UNIX中,Oracle 会给你创建该工具所需的信息。无需使bbed变成像exp or sqlplus那样活跃的可执行文件。在Windows上旧版本的Oracle中,可执行文件已安装好可供使用,但现在的版本不是这样。甚至无需成为RDBMS安装就可得到BBED.EXE(在Windows上它是如何命名的)。使用一个Oracle8i客户端安装,BBED.EXE默认安装在 $ORACLE_HOME/bin 。
在UNIX上的32位安装(指所有的* NIX变种),请在$ORACLE_HOME/rdbms/lib下找两个目标文件:sbbdpt.o和ssbbded.o。在64位安装,文件将在lib32目录下。
[oracle] ls -la *bb*.o
-rw-r–r– 1 oracle dba 1160 Nov 18 2003 sbbdpt.o
-rw-r–r– 1 oracle dba 848 Nov 18 2003 ssbbded.o
要新建或创造可执行文件,使用如下所示的make命令。
[oracle] make -f ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed
make命令的示例输出如下所示。
Linking BBED utility (bbed)
rm -f /u001/app/oracle/ora904/rdbms/lib/bbed
gcc -o /u001/app/oracle/ora904/rdbms/lib/bbed -L/u001/app/oracle/ora904/rdbms/lib/
-L/u001/app/oracle/ora904/lib/ /u001/app/oracle/ora904/lib/s0main.o
/u001/app/oracle/ora904/rdbms/lib/ssbbded.o
/u001/app/oracle/ora904/rdbms/lib/sbbdpt.o `cat
/u001/app/oracle/ora904/lib/ldflags` -lnsslb9 -lncrypt9 -lnsgr9 -lnzjs9 –
<some lines removed>
lcommon9 -lgeneric9 -ltrace9 -lnls9 -lcore9 -lnls9 -lcore9 -lnls9 -lxml9 -lcore9
-lunls9 -lclient9 -lvsn9 -lwtc9 -lcommon9 -lgeneric9 -lnls9 -lcore9 -lnls9
-lcore9 -lnls9 -lxml9 -lcore9 -lunls9 `cat
/u001/app/oracle/ora904/lib/sysliblist`
-Wl,-rpath,/u001/app/oracle/ora904/lib:/lib:/usr/lib -lm `cat
/u001/app/oracle/ora904/lib/sysliblist` -ldl -lm
10.2.0.1安装的示例输出如下所示。出示的理由是为了说明在标志Oracle版本(9和10)之间的差异。换句话说,不能保证可以从一个版本提取BBED并将它用在其它版本上(当然,欢迎尝试)。
[oracle@oralinux lib]$ make -f ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed
Linking BBED utility (bbed)
rm -f /opt/oracle/product/10.2.0/db_1/rdbms/lib/bbed
gcc -o /opt/oracle/product/10.2.0/db_1/rdbms/lib/bbed –
L/opt/oracle/product/10.2.0/db_1/rdbms/lib/ –
L/opt/oracle/product/10.2.0/db_1/lib/ –
L/opt/oracle/product/10.2.0/db_1/lib/stubs/ -L/usr/lib -lirc
/opt/oracle/product/10.2.0/db_1/lib/s0main.o
/opt/oracle/product/10.2.0/db_1/rdbms/lib/ssbbded.o
/opt/oracle/product/10.2.0/db_1/rdbms/lib/sbbdpt.o `cat
/opt/oracle/product/10.2.0/db_1/lib/ldflags` -lnsslb10 -lncrypt10 -lnsgr10
<some lines removed>
-lclient10 -lnnetd10 -lvsn10 -lcommon10 -lgeneric10 -lsnls10 -lnls10 –
lcore10 -lsnls10 -lnls10 -lcore10 -lsnls10 -lnls10 -lxml10 -lcore10 -lunls10
-lsnls10 -lnls10 -lcore10 -lnls10 `cat
/opt/oracle/product/10.2.0/db_1/lib/sysliblist` -Wl,-
rpath,/opt/oracle/product/10.2.0/db_1/lib -lm `cat
/opt/oracle/product/10.2.0/db_1/lib/sysliblist` -ldl -lm –
L/opt/oracle/product/10.2.0/db_1/lib
为确认创建,查看是否创建BBED可执行文件。在这个例子中,make命令在rdbms/lib 目录中执行。你可以将BBED放到任何你喜欢的地方。此外,如果有需要请更改权限。
-rwxr-xr-x 1 oracle dba 434057 Aug 25 16:26 bbed
为了证实该实用工具实际运行,调用它。本例使用10g版本,这说明发布2.0.0.0.0版本,9.0.4版本也是如此。除了著作权的变化,在相当长的一段时间内版本并未发生变化。
[oracle@oralinux lib]$ ./bbed
Password:
BBED: Release 2.0.0.0.0 – Limited Production on Wed Aug 27 16:17:06 2009
Copyright (c) 1982, 2005, Oracle. All rights reserved.
************* !!! For Oracle Internal Use only !!! ***************
BBED>
Bbed背后的的是“大”揭秘
请注意,会提示你输入密码。几乎所有的网上搜索到的BBED参考文献都会提到,如果你动机足够强大首选使用BBED,那你就足够聪明能自己确定密码。 不管怎样。密码是blockedit。在BBED的十六进制转储文件中你会将它视为BLOCKEDIT。在/ usr/ bin中使用XXD创建BBED转储,然后在文件中查找“BBED>”。上面的几行就是BLOCKEDIT。
注意事项
首先:从客户的角度来看,BBED是个未公开的、不受支持的实用程序。如果没有引导借助Oracle Support使用这个工具,你需要独立运行。如果不知道要做什么,就不要在生产数据库中使用BBED。如果不能承受失败,就不要在任何数据库上使用BBED。提取使用此工具的数据库备份。
如果你需要恢复数据,并发现自己完全陷入困境,迄今做的很多努力也没用,这是最后的解决办法。可能会有更大更好的工具,但“此时此地”的工具就是bbed。如果需要此工具来保存/救援/恢复生产数据库,对你最有利的是先冷备份,然后提取备份的副本作为测试平台。换句话说,操作文件与实际文件分开。如果你尝试恢复数据,将其从“救援”实例转换回生产实例。
关于BBED的Oracle文档(包括在MetaLink上搜索),在公共领域内几乎检索不到。MetaLink文档62015.1有(假设它仍然存在于OSS内)一个说明,“BBED只是一个支持工具,不应与客户进行讨论。” (详见http://www.freelists.org/post/oracle-l/is-it-the-bbed )
尽管如此,有关此工具(以及其他工具)的信息可以从Oracle软件附带的信息库中收集到。$ORACLE_HOME/rdbms/mesg 包含一个名为BBEDus.msg的文件。提取或识别文件,仔细阅读其内容以得知此工具是如何运行的。信息库内(信息库末尾)是有效的位置参数的列表,其中之一就是HELP。Oracle的Windows安装仍然包含信息库,虽然不再包含BBED.EXE。
有用的工具
开始运行BBED前,大概了解数据块周围的路径是很有用的,包括如何在一个表中由行获得内部块的信息。这个以及其他必要信息,通常包括绝对文件号,完整路径和数据文件的名称,块中数据文件的大小,数据块地址,块编号,块大小和块类型等信息。
你需要一个报告工具输出有关块的信息。不止一种方法可以得到这个信息,但最简单的是基于使用内置的名为DBMS_ROWID所提供的PL / SQL。至少在Oracle8i中的文件包(有十大功能和一个程序)已经可用,但使用这个文件包对你而言是全新的(你多久会挖掘一次数据块的内部信息?)。几个功能信息借助OUT参数,在一个过程中结合。围绕DBMS_ROWID.ROWID_INFO创建自己的包装过程,使之可重复使用。
我们看一下这个过程包含什么 (Oracle® Database PL/SQL Packages and Types Reference 10g Release 2 (10.2)).
ROWID_INFO 步骤
该过程返回到有关ROWID的信息,包括其类型(限制或扩展),以及ROWID的组件。这是一个过程,不能在SQL语句中使用。
句法
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);
样本“get_rowinfo”包装过程如下所示。
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;
/
注意占位符变量是如何用于OUT参数,且可以直接引用。代码中的参数列表还显示了过去在列表中传递的文件类型(SMALLFILE)。文档将此显示为第二个参数,这是不对的。对文件包发出的描述命令显示也是如此。
结束语
安装BBED相当简单,并且一旦超密密码已知,就能够使用该工具打开多种可能性。只能够看到数据如何存储在一个文件中,其本身是有价值的,正如Oracle如何以目前的状态来标签或标记数据块。在以后的文章中,我们将使用裸骨数据库并查看数据文件的内容。
Leave a Reply