您的位置:首页 > 数据库 > Oracle

使用bbed直接修改oracle数据文件恢复被delete掉的数据

2009-07-07 11:17 686 查看
今天简单写篇有关oracle BBED 与oracle 数据文件block 格式结合起来运用的文章。以更了解数据库的内部的某些东西。一条记录被delete

后,如何通过直接修改oracle 的数据文件,而直接将数据恢复的方法。当然不管表被delete 也好,drop 也好,teuncate也好,有很多的恢复

方法。在此只是研究其中的一种。以起到抛砖引玉的作用。(如转载请注明出处www.sosdb.com)

以下通过具体的试验来详细解释整个过程:

1.create tablespace sosdbcom datafile '/ora/sosdbcom.dbf' size 5M;

2.create table sosdb(sos01 varchar2(15),sos02 number(4)) tablespace sosdbcom;

3.insert into sosdb values('www.sosdb.com',86)

insert into sosdb select * from sosdb.com;

insert into sosdb select * from sosdb.com;

commit;

4.select * from sosdb;

SOS01 SOS02

--------------- ----------

www.sosdb.com 86

www.sosdb.com 86

www.sosdb.com 86

www.sosdb.com 86

现在我们删除一条,就选择第一条吧。

5。delete from sosdb where roenum<2;

commit;

现在看看

SQL> select * from sosdb;

SOS01 SOS02

--------------- ----------

www.sosdb.com 86

www.sosdb.com 86

www.sosdb.com 86

SQL>

好了,剩下的工作就如何通过修改oracle datafile 的block
,直接将被删除的这条记录恢复出来的工作了。

这里需要用到bbed ,至于bbed的使用方法见:

http://www.sosdb.com/jdul/dispbbs.asp?boardID=1&ID=237&page=1
写一个bbed 参数文件 par.bbd

blocksize=8192

listfile=a.txt

mode=edit

写一个a.txt

15 /ora/sosdbcom.dbf 5251072

打开bbed:

[oracle@mail ora]$./bbed parfile=par.bbd

dump file 14 block 10 count 8192

把这个block dump出来看看,会发现最后的一部份内容是:

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 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 2c00020d 7777772e 736f7364 622e636f 6d02c157

2c00020d 7777772e 736f7364 622e636f 6d02c157 2c00020d 7777772e 736f7364

622e636f 6d02c157 3c02020d 7777772e 736f7364 622e636f 6d02c157 01064cd4

分析会发现每个row 的标志为 2c00,但一条为3c02 ,其实这个就是被删除的那条记录的标志。我们只

要把这个标志修改过来,然后再修改一下数据文件的某些标志就可以了。

修改方法如下:

bbed> modify /x 2c file 14 block 10 offset 8168

bbed> modify /x 00 file 14 block 10 offset 8169

修改完之后block的状态是corrupt的。用sum命令使之有效。

bbed> sum file 14 block 10 apply

现在重新启动oracle数据库并查询表sosdb:

SQL> conn / as sysdba

Connected to an idle instance.

SQL> startup

ORACLE instance started.

Total System Global Area 236000356 bytes

Fixed Size 451684 bytes

Variable Size 201326592 bytes

Database Buffers 33554432 bytes

Redo Buffers 667648 bytes

Database mounted.

Database opened.

SQL> select * from sosdb;

SOS01 SOS02

--------------- ----------

www.sosdb.com 86

www.sosdb.com 86

www.sosdb.com 86

www.sosdb.com 86

OK,到此,删除的记录恢复成功。

在这里只是讲个简单的例子,其实很多时候我们都可以采用此类的方法来做些其他的工作,尤其是恢复工作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: