模拟文件损坏可以使用两个工具,windows nt 下使用uttra edit ,还有就是使用ORACLE内部工具BBED,下面主要看这个工具如何使用。
一、BBED(Oracle Block Browerand EDitor Tool),用来直接查看和修改数据文件数据的一个工具,是Oracle一款内部工具,可以直接修改Oracle数据文件块的内容,在一些极端恢复场景下比较有用。该工具不受Oracle支持,所以默认是没有生成可执行文件的,在使用前需要重新连接。
我这里的作用
二、BBED 安装
Oracle8i 的BBED在windows 平台下的$ORACLE_HOME/bin下可以找到,9i中似乎未随软件发布,故在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可执行文件在$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中复制如下文件到相应目录,然后再执行上述连接命令,参考如下步骤:
(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,都是将一些配置信息写入到一个参数文本里,在调用bbed时,指定该参数文件。如:
$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 系统内部的file id 相同。 当然这个id 我们也可以自己指定。 当我们在bbed 里设置file id 时,就是根据这个参数文件中的的设置来的。 最好设置为相同,不然以后可能会混淆。
将上面查询出来的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
创建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!...³
<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!...³
<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参数,使checksum一致。即之前的修改生效。
SYS@dave2(db2)> alter system flush buffer_cache;
System altered.
SYS@dave2(db2)> select * from dvd;
JOB
--------------------------------------------------------------------------------
DMM is DBA!
Dave like Oracle!
上面的修改是数据的到正确的修改,如何制造一个坏块。
继续上使用上面的哦数据:
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'