今天简单写篇有关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,到此,删除的记录恢复成功。
在这里只是讲个简单的例子,其实很多时候我们都可以采用此类的方法来做些其他的工作,尤其是恢复工作。
![](https://img2024.cnblogs.com/blog/35695/202405/35695-20240529225347158-1507288531.jpg)