今天簡單寫篇有關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,到此,刪除的記錄恢複成功。
在這裡只是講個簡單的例子,其實很多時候我們都可以採用此類的方法來做些其他的工作,尤其是恢複工作。