Oracle模拟文件损坏BBED

模拟文件损坏可以使用两个工具,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

[[email protected] 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目录

[[email protected] 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

[[email protected] 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:

[[email protected] ~]$ cat /u01/bbed.par

blocksize=8192

listfile=/u01/filelist.txt

mode=edit

示例: 修改Data 内容

1.1 连接bbed

[[email protected] ~]$ 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 查看要修改的内容

[email protected](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

?

[email protected](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参数,使checksum一致。即之前的修改生效。

?

?

[email protected](db2)> alter system flush buffer_cache;

System altered.

?

[email protected](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 [email protected]\s".....

1ef00000 01000000 e1dd0000 3e732200 l ............>s".

00000000 02003200 a1c04001 02000b00 l [email protected]

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‘

参考:Oracle BBED 工具 说明

Oracle corrupt block(坏块) 详解

时间: 2024-12-26 07:28:40

Oracle模拟文件损坏BBED的相关文章

Oracle dmp文件损坏恢复案例

前一段时间帮一个朋友的朋友恢复了一个损坏的dmp文件,大概100多个G,记录一下恢复过程并简单总结一下 一.描述 这个dmp文件是从一个Oracle 9i的数据库上exp出来的,在导入Oracle 11g版本的时候,可能会随机出现两类错误,如下 (1)dmp文件导入的时候,一直停留在某张表上不动,两三天都是这样,导入操作无法进行,如下 导入了                                                             0 行 . . 正在导入表    

关于数据库文件损坏风险的提醒

前言 小y最近处理了几起Oracle数据库文件损坏的case,因为某些Bug风险较大,因此不敢有丝毫怠慢,赶紧拿出来分享!希望能够帮助到有需要的朋友!风险提示! 如上图所示,Linux 5/6上的一个已知缺陷,在某些触发条件下,将导致Oracle数据文件出现内容全是0的的坏块.该操作系统上的缺陷,除了会导致Oracle数据库数据文件损坏外,还会导致包括归档日志.在线日志的损坏.而如果是current状态的在线日志发生损坏,那么对于数据库的影响将是致命的.需要引起重视! BUG触发条件: 当同时满

ORACLE模拟临时文件、日志成员、口令文件丢失情况与恢复【weber出品】

一.临时表空间文件.日志文件和口令文件都属于非关键性文件,因为这些文件丢失后并不会影响到整个数据库的完整性. 但是,当这些文件丢失后我们需要快速的找回这些文件.接下来我将模拟临时表空间文件.日志文件和口令文件丢失的情况. 二.如果属于 TEMP 表空间的临时文件丢失或损坏,则 TEMP 表空间将不可用.例如:在执行需要 TEMP 空间进行排序的 SQL 语句过程中,此问题将声明其为错误. 一般会用到临时表空间的场景有: 索引create或rebuild Order by 或 group by D

案例:Oracle exp dmp文件损坏 通过CPFL工具抽取dmp中的数据表进行恢复

Oracle数据库逻辑导出exp的dmp文件损坏,通过非常规恢复抽取dmp文件中表的数据 在有些时候,exp的dmp文件因为某种原因损坏(比如磁盘异常,exp过程损坏等),导致imp导入无法继续,下面的处理方法(直接读取dmp文件)来对dmp文件进行抢救性恢复,最大程度减少数据丢失损失 1.创建exp dmp文件并使用dd破坏 SQL> create table t_xifenfei as select * from dba_objects; Table created. SQL> selec

oracle ora-01578 ORACLE 数据块损坏 (文件号 4, 块号 840339)

ORA-01578是 数据块物理坏块/损坏的一种,不同于逻辑损坏/坏块,一般 会伴随ORA-1110出现,一旦ORACLE读取到存在损坏的块就会报出Caused by: java.sql.SQLException: ORA-01578: ORACLE 数据块损坏 (文件号 4, 块号 840339)ORA-01110: 数据文件 4: 'E:\APP\ADMINISTRATOR\ORADATA\ORCL\USERS01.DBF' 解决方法如下:1.使用DBV检查数据文件,在cmd目录下直接输入d

[课]9.2模拟数据库,表空间和数据文件损坏后的恢复操作

1环境准备 对数据库做一次全备份: 验证当前的备份文件: 2数据库损坏的恢复 2.1模拟数据库损坏 尝试重启数据库查看报错: 这里需要重点说明的是因为我们用的是CATLOG数据库作为目录数据库,所以即使控制文件丢失也不影响我们进行恢复. 现在我们查看一下告警文件的报错: 2.2进行数据库恢复 3表空间损坏的恢复 3.1模拟表空间损坏 查看当前库的表空间,现在我们就模拟TEST_MSSM和TEST_ASSM表空间损坏. 删除表空间文件: 重启数据库查看报错信息: 我们查询一下告警文件里的错误信息:

Oracle数据块损坏篇之10231内部事件

实验:某个分区数据块损坏,不完全恢复此分区表数据背景:数据库没有有效备份,某个分区中有数据块损坏.要求:最大限度恢复此分区数据.环境:RHEL 6.4 + Oracle 11.2.0.4 1. 初始化实验环境 2. 模拟分区中有数据块损坏情景 3. 尝试使用Oracle内部事件10231进行不完全恢复 Reference 1. 初始化实验环境 初始化创建模拟实验环境用到的表空间.业务用户.表,并导入测试数据.本次实验用到表空间DBS_D_JINGYU, 业务用户JINGYU, 分区表T_PART

Oracle数据块损坏的恢复实例

测试环境:11.2.0.4 1.构建数据块损坏的测试环境 2.有备份:常规恢复坏块 3.无备份:跳过坏块 1.构建数据块损坏的测试环境 1.1 创建测试表 --Create Table t_test conn jingyu/jingyu drop table t_test purge; create table t_test (id number, name char(2000)); --Insert data insert into t_test values(1, 'alfred 1');

非系统数据文件损坏,rman备份恢复

实验前提:已经做好备份. SQL> col file_name for a50select file_id,file_name from dba_data_files;  FILE_ID FILE_NAME---------- --------------------------------------------------4 /home/oracle/app/oradata/orcl/users01.dbf2 /home/oracle/app/oradata/orcl/sysaux01.db