使用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,到此,删除的记录恢复成功。
在这里只是讲个简单的例子,其实很多时候我们都可以采用此类的方法来做些其他的工作,尤其是恢复工作。
后,如何通过直接修改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,到此,删除的记录恢复成功。
在这里只是讲个简单的例子,其实很多时候我们都可以采用此类的方法来做些其他的工作,尤其是恢复工作。
相关文章推荐
- ORACLE DBA工具收集(Oracle DUL/AUL/ODU 恢复工具,可以脱离Oracle运行环境,直接从数据文件中读取记录)
- oracle特殊恢复-bbed修改某个数据文件头
- Oracle DBA的神器: PRM恢复工具,可脱离Oracle软件运行,直接读取Oracle数据文件中的数据
- Oracle 之利用BBED修改数据块SCN----没有备份数据文件的数据恢复
- Oracle DBA的神器: PRM恢复工具,可脱离Oracle软件运行,直接读取Oracle数据文件中的数据
- Oracle 数据文件在无备份情况下的恢复
- linux利用文件句柄恢复oracle数据
- Oracle闪回技术之一Oracle 11g 利用FlashTable (闪回表)恢复(用delete)误删的数据
- Oracle —— 闪回查询恢复delete删除数据
- oracle数据文件recover恢复过程
- Oracle数据文件物理删除后的恢复
- Oracle闪回查询恢复delete删除数据
- Oracle意外删除数据文件恢复方法
- 使用linux文件句柄恢复误删除的Oracle数据文件
- 误删oracle数据文件的错误恢复
- oracle移动数据/修改数据文件路径
- Oracle中表被删除或数据被错误修改后的恢复方法
- 【转载】linux中误删除oracle数据文件的恢复操作
- [Oracle]如果误删了某个数据文件,又没有被备份,能否恢复?
- oracle 数据文件,控制文件和参数文件全部丢失恢复