模擬文件損壞可以使用兩個工具, windows nt 下使用 uttra edit ,還有就是使用 ORACLE 內部工具 BBED, 下面主要看這個工具如何使用。
一、 BBED(Oracle?Block?Browerand?EDitor Tool) ,用來直接查看和修改數(shù)據(jù)文件數(shù)據(jù)的一個工具,是 Oracle 一款內部工具,可以直接修改 Oracle 數(shù)據(jù)文件塊的內容,在一些極端恢復場景下比較有用。該工具不受 Oracle 支持,所以默認是沒有生成可執(zhí)行文件的,在使用前需要重新連接。
我這里的作用
二、 BBED 安裝
Oracle8i 的 BBED 在 windows 平臺下的 $ORACLE_HOME/bin 下可以找到, 9i 中似乎未隨軟件發(fā)布,故在 windows 沒有這個工具,
在 linux 上面有,需要編譯。
在 9i/10g 中連接生成 bbed:
cd$ORACLE_HOME/rdbms/lib
make-f ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed
[oracle@oracledba lib]$ make -f ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bb ed
Linking BBED utility (bbed)
rm -f /opt/oracle/102/rdbms/lib/bbed
gcc -o /opt/oracle/102/rdbms/lib/bbed -L/opt/oracle/102/rdbms/lib/ -L/o pt/oracle/102/lib/ -L/opt/oracle/102/lib/stubs/ /opt/oracle/102/lib/s0 main.o /opt/oracle/102/rdbms/lib/ssbbded.o /opt/oracle/102/rdbms/lib/sb bdpt.o `cat /opt/oracle/102/lib/ldflags` -lnsslb10 -lncrypt10 -lnsgr 10 -lnzjs10 -ln10 -lnnz10 -lnl10 /opt/oracle/102/rdbms/lib/defopt.o -ld btools10 -lclntsh `cat /opt/oracle/102/lib/ldflags` -lnsslb10 -lncr ypt10 -lnsgr10 -lnzjs10 -ln10 -lnnz10 -lnl10 -lnro10 `cat /opt/oracle/1 02/lib/ldflags` -lnsslb10 -lncrypt10 -lnsgr10 -lnzjs10 -ln10 -lnnz10 -lnl10 -lclient10 -lnnetd10 -lvsn10 -lcommon10 -lgeneric10 -lmm -lsnl s10 -lnls10 -lcore10 -lsnls10 -lnls10 -lcore10 -lsnls10 -lnls10 -lxml1 0 -lcore10 -lunls10 -lsnls10 -lnls10 -lcore10 -lnls10 `cat /opt/oracle/ 102/lib/ldflags` -lnsslb10 -lncrypt10 -lnsgr10 -lnzjs10 -ln10 -lnnz1 0 -lnl10 -lnro10 `cat /opt/oracle/102/lib/ldflags` -lnsslb10 -lncryp t10 -lnsgr10 -lnzjs10 -ln10 -lnnz10 -lnl10 -lclient10 -lnnetd10 -lvsn1 0 -lcommon10 -lgeneric10 -lsnls10 -lnls10 -lcore10 -lsnls10 -lnls10 -lcore10 -lsnls10 -lnls10 -lxml10 -lcore10 -lunls10 -lsnls10 -lnls10 -l core10 -lnls10 -lclient10 -lnnetd10 -lvsn10 -lcommon10 -lgeneric10 -ls nls10 -lnls10 -lcore10 -lsnls10 -lnls10 -lcore10 -lsnls10 -lnls10 -lxm l10 -lcore10 -lunls10 -lsnls10 -lnls10 -lcore10 -lnls10 `cat /opt/ora cle/102/lib/sysliblist` -Wl,-rpath,/opt/oracle/102/lib -lm `cat /opt /oracle/102/lib/sysliblist` -ldl -lm -L/opt/oracle/102/lib
以上生成的bbed可執(zhí)行文件在$ORACLE_HOME/rdbms/lib目錄,可以復制到其他位置或者其他同Oracle版本的機器上運行。
也可通過以下命令將bbed生成到$ORACLE_HOME/bin目錄
[oracle@db2 lib]$ make -f ins_rdbms.mk BBED=$ORACLE_HOME/bin/bbed $ORACLE_HOME/bin/bbed
OracleDatabase 11g中缺省的未提供BBED庫文件,但是可以用10g的文件編譯出來,需要先從10g中復制如下文件到相應目錄,然后再執(zhí)行上述連接命令,參考如下步驟:
(1)復制Oracle 10g文件
Copy $ORA10g_HOME/rdbms/lib/ssbbded.o to$ORA11g_HOME/rdbms/lib
Copy $ORA10g_HOME/rdbms/lib/sbbdpt.o to $ORA11g_HOME/rdbms/lib
Copy $ORA10g_HOME/rdbms/mesg/bbedus.msb to $ORA11g_HOME/rdbms/mesg
Copy $ORA10g_HOME/rdbms/mesg/bbedus.msg to $ORA11g_HOME/rdbms/mesg
Copy $ORA10g_HOME/rdbms/mesg/bbedar.msb to $ORA11g_HOME/rdbms/mesg
(2)編譯
make -f $ORA11g_HOME/rdbms/lib/ins_rdbms.mkBBED=$ORACLE_HOME/bin/bbed $ORACLE_HOME/bin/bbed
三、使用 BBED
?????? ?BBED 是 Oracle 內部使用的命令,所以 Oracle 不提供技術支持。 為了安全, BBED 設置了口令保護,默認密碼為 blockedit
[oracle@oracledba lib]$ bbed
Password:
BBED: Release 2.0.0.0.0 - Limited Production on Mon Aug 25 04:23:33 2014
Copyright (c) 1982, 2005, Oracle. All rights reserved.
************* !!! For Oracle Internal Use only !!! ***************
一般使用 bbed ,都是將一些配置信息寫入到一個參數(shù)文本里,在調用 bbed 時,指定該參數(shù)文件。如:
?????? $bbedparfile=bbed.par
這里我們先演示一個示例。
( 1 )先獲取 datafile 的信息
將 datafile 的信息寫入一個文件,格式為:文件編號 文件名字 文件大小。可以通過如下 SQL 獲取:
SQL> select file#||' '||name||' '||bytes from v$datafile ;
FILE#||''||NAME||''||BYTES
--------------------------------------------------------------------------------
1 /opt/oracle/oradata/orcla/system01.dbf 555745280
2 /opt/oracle/oradata/orcla/undotbs01.dbf 162529280
3 /opt/oracle/oradata/orcla/sysaux01.dbf 367001600
4 /opt/oracle/oradata/orcla/users01.dbf 17039360
5 /opt/oracle/oradata/orcla/xzsp.dbf 536870912
6 /home/oracle/b101.dbf 52428800
6 rows selected.
注意,這里的file id。 我們這里的file id 和 oracle 系統(tǒng)內部的file id 相同。 當然這個id 我們也可以自己指定。 當我們在bbed 里設置file id 時,就是根據(jù)這個參數(shù)文件中的的設置來的。 最好設置為相同,不然以后可能會混淆。
將上面查詢出來的datafile信息保存到文本里。
cat /u01/filelist.txt
1/u01/app/oracle/oradata/dave2/system01.dbf 1761607680
2/u01/app/oracle/oradata/dave2/undotbs01.dbf 927989760
3/u01/app/oracle/oradata/dave2/sysaux01.dbf 398458880
4 /u01/app/oracle/oradata/dave2/users01.dbf5242880
5/u01/app/oracle/oradata/dave2/example01.dbf 104857600
6 /u01/app/oracle/oradata/dave2/dave01.dbf10485760
7/u01/app/oracle/oradata/dave2/undotbs02.dbf 1048576
8/u01/app/oracle/oradata/dave2/huaining01.dbf 52428800
創(chuàng)建 parameter file :
[oracle@db2 ~]$ cat /u01/bbed.par
blocksize=8192
listfile=/u01/filelist.txt
mode=edit
示例: 修改Data 內容
1.1 連接bbed
[oracle@db2 ~]$ bbed parfile=/u01/bbed.par
Password:
?
BBED: Release 2.0.0.0.0 - LimitedProduction on Fri Aug 12 18:26:46 2011
?
Copyright (c) 1982, 2005, Oracle. All rights reserved.
?
************* !!! For Oracle Internal Useonly !!! ***************
?
BBED>
?
1.2 查看要修改的內容
SYS@dave2(db2)> select * from test;
?
JOB
--------------------------------------------------------------------------------
Dave is DBA!
Dave like Oracle!
注意: bbed 的修改僅僅是對原有位置內容的一個替換。
?
對應block 的信息如下:
select
rowid,
dbms_rowid.rowid_relative_fno(rowid) rel_fno,
dbms_rowid.rowid_block_number(rowid) blockno,
dbms_rowid.rowid_row_number(rowid) rowno
from test where rownum<2;
ROWID REL_FNO BLOCKNO ROWNO
------------------ ---------- --------------------
AAAN9VAABAAAcKiAAA 1 115362 0
AAAN9VAABAAAcKiAAB 1 115362 1
?
SYS@dave2(db2)>
?
1.3 查找關鍵字Dave,確定其在block中的偏移量offset。
?
BBED> set dba 1,115362 offset 0
DBA 0x0041c2a2(4309666 1,115362)
OFFSET 0
?
BBED> find /c Dave
File:/u01/app/oracle/oradata/dave2/system01.dbf (1)
Block: 115362 Offsets: 8176 to 8191 Dba:0x0041c2a2
------------------------------------------------------------------------
44617665 20697320 44424121 020616b3
?
<32 bytes per line>
?
dump 查看具體內容:
BBED> dump /v dba 1,115362 offset 8176 count 128
File: /u01/app/oracle/oradata/dave2/system01.dbf(1)
Block: 115362 Offsets: 8176 to 8191 Dba:0x0041c2a2
-------------------------------------------------------
44617665 20697320 44424121 020616b3 l Dave isDBA!...3
<16 bytes per line>
注意這里面的Offsets:8176 to 8191, 它指的是這一行的一個地址。其中
D 的offset 是8176
a 的offset 是8177
v 的offset 是8178
e 的offset 是8179
空格也算offset。
?
1.4 修改block,將Dave 換成DMM
BBED> modify /c 'DMM ' dba 1,115362 offset 8176
File:/u01/app/oracle/oradata/dave2/system01.dbf (1)
Block: 115362 Offsets: 8176 to 8191 Dba:0x0041c2a2
------------------------------------------------------------------------
444d4d20 20697320 44424121 020616b3
<32 bytes per line>
--注意這里DMM我用單引號括起來,并且最后還有一個空格,這樣就是4個bytes,不用單引號括起來,無法表示空格,驗證一下
?
BBED> dump /v dba 1,115362 offset 8176count 128
File:/u01/app/oracle/oradata/dave2/system01.dbf (1)
Block: 115362 Offsets: 8176 to 8191 Dba:0x0041c2a2
-------------------------------------------------------
444d4d20 20697320 44424121 020616b3 l DMM is DBA!...3
?
<16 bytes per line>
?
1.5 應用變更
BBED> sum dba 1,115362
Check value for File 1, Block 115362:
current = 0xdef7, required = 0x8cc0
此時 current checksum 是0xdef7,requiredchecksum 是0x8cc0
?
BBED> sum dba 1,115362 apply
Check value for File 1, Block 115362:
current = 0x8cc0, required = 0x8cc0
加上apply參數(shù),使checksum一致。即之前的修改生效。
?
?
SYS@dave2(db2)> alter system flush buffer_cache;
System altered.
?
SYS@dave2(db2)> select * from dvd;
JOB
--------------------------------------------------------------------------------
DMM is DBA!
Dave like Oracle!
上面的修改是數(shù)據(jù)的到正確的修改,如何制造一個壞塊。
繼續(xù)上使用上面的哦數(shù)據(jù):
BBED> map
File: /opt/oracle/oradata/orcla/xzsp.dbf (5)
Block: 49316 Dba:0x0140c0a4
------------------------------------------------------------
KTB Data Block (Table/Cluster)
struct kcbh, 20 bytes @0
struct ktbbh, 72 bytes @20
struct kdbh, 14 bytes @100
struct kdbt[1], 4 bytes @114
sb2 kdbr[2] @118
ub1 freespace[8029] @122
ub1 rowdata[37] @8151
ub4 tailchk @8188
BBED> d /v offset 0 count 128
File: /opt/oracle/oradata/orcla/xzsp.dbf (5)
Block: 49316 Offsets: 0 to 127 Dba:0x0140c0a4
-------------------------------------------------------
06a20000 a4c04001 5c732200 00000106 l ......@.\s".....
1ef00000 01000000 e1dd0000 3e732200 l ............>s".
00000000 02003200 a1c04001 02000b00 l ......2...@.....
d3040000 92008000 76021700 02200000 l ........v.... ..
5c732200 00000000 00000000 00000000 l \s".............
00000000 00000000 00000000 00000000 l ................
00000000 00010200 ffff1600 731f5d1f l ............s.].
5d1f0000 0200881f 731f0000 00000000 l ].......s.......
<16 bytes per line>
BBED> modify /x 12345678 offset 0
File: /opt/oracle/oradata/orcla/xzsp.dbf (5)
Block: 49316 Offsets: 0 to 127 Dba:0x0140c0a4
------------------------------------------------------------------------
12345678 a4c04001 5c732200 00000106 1ef00000 01000000 e1dd0000 3e732200
00000000 02003200 a1c04001 02000b00 d3040000 92008000 76021700 02200000
5c732200 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00010200 ffff1600 731f5d1f 5d1f0000 0200881f 731f0000 00000000
<32 bytes per line>
BBED> sum apply
Check value for File 5, Block 49316:
current = 0x1e5c, required = 0x1e5c
SQL> alter system flush buffer_cache;
System altered.
SQL> select * from tt;
select * from tt
*
ERROR at line 1:
ORA-01578: ORACLE data block corrupted (file # 5, block # 49316)
ORA-01110: data file 5: '/opt/oracle/oradata/orcla/xzsp.dbf'
更多文章、技術交流、商務合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
