bbed还原数据实例

本文详细介绍了如何利用Oracle的bbed工具进行数据恢复。首先,通过配置bbed环境,然后创建并编辑所需文件,接着在Oracle用户下运行bbed。通过实例展示了如何创建表空间、插入数据、删除数据,并定位到被删除的块。最后,使用bbed修改块内容,成功恢复被删除的数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 su - oracle
cd $ORACLE_HOME/rdbms/lib
//安装bbed oracle 自带
make -f ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed

//将bbed链接到$ORACLE_HOME/bin
ln -s $ORACLE_HOME/rdbms/lib/bbed $ORACLE_HOME/bin/bbed 

lib]$ ./bbed
Password: blockedit

做2个文件 
vi /home/oracle/bbed.par
添加:
BLOCKSIZE=8192
listfile=filelist.txt
logfile=log.bbd

vi /home/oracle/filelist.txt
添加你要想要操作的文件:  select file_id||' '||file_name||' '||bytes from dba_data_files;

4 /u1/oracle/oradata/madrid/users01.dbf 458752000

在oracle 用户下运行
bbed parfile=/home/oracle/bbed.par

环境已经准备好!
1.实例:
select file#,name from v$datafile;
create tablespace tbs01 datafile '/home/oracle/tbs01.dbf' size 5m;

把这个新建的数据文件加入filelist.txt

select file#,name from v$datafile; ---知道TBS01的表空间在第几个文件中 这里查出的是5

create table scott.t (x int,name varchar2(10)) tablespace tbs01;
insert into scott.t values (1,'alvin1');   
insert into scott.t values (2,'alvin1');   
insert into scott.t values (3,'alvin1');    
insert into scott.t values (4,'alvin1');    
insert into scott.t values (5,'alvin1');   
commit;

//查询插入的数据在那个块上
select dbms_rowid.rowid_block_number(rowid) block,t.* from scott.t;

     BLOCK          X NAME
---------- ---------- ----------------------------------------
        20          1 alvin1
        20          2 alvin1
        20          3 alvin1
        20          4 alvin1
        20          5 alvin1


//删除一行
SQL> delete scott.t where x=3;

1 row deleted.

SQL> commit
  2  ;

Commit complete.

SQL> select * from scott.t;

         X NAME
---------- ----------------------------------------
         1 alvin1
         2 alvin1
         4 alvin1
         5 alvin1

//更改跟踪日志的名称,便于查找
alter session set tracefile_identifier='alter_create';

//This will set the current session's pid
SQL> oradebug setmypid
Statement processed.
//This will return the trace file generated for this event
SQL> oradebug tracefile_name
/u01/app/oracle/admin/orcl/udump/orcl_ora_8203_alter_create.trc


----把文件找出来。在上面找到的5号文件上的20块。
SQL> alter system dump datafile 5 block 20;

select file_id||' '||file_name||' '||bytes from dba_data_files;

FILE_ID||''||FILE_NAME||''||BYTES
--------------------------------------------------------------------------------
4 /u01/app/oracle/oradata/orcl/users01.dbf 5242880
3 /u01/app/oracle/oradata/orcl/sysaux01.dbf 262144000
2 /u01/app/oracle/oradata/orcl/undotbs01.dbf 26214400
1 /u01/app/oracle/oradata/orcl/system01.dbf 503316480
5 /home/oracle/tbs01.dbf 5242880

查看 跟踪文件
!vim /u01/app/oracle/admin/orcl/udump/orcl_ora_8203_alter_create.trc
tab 0, row 0, @0x1f8b
tl: 13 fb: --H-FL-- lb: 0x0  cc: 2
col  0: [ 2]  c1 02
col  1: [ 6]  61 6c 76 69 6e 31
tab 0, row 1, @0x1f7e
tl: 13 fb: --H-FL-- lb: 0x0  cc: 2
col  0: [ 2]  c1 03
col  1: [ 6]  61 6c 76 69 6e 31
tab 0, row 2, @0x1f71
tl: 2 fb: --HDFL-- lb: 0x2
tab 0, row 3, @0x1f64
tl: 13 fb: --H-FL-- lb: 0x0  cc: 2
col  0: [ 2]  c1 05
col  1: [ 6]  61 6c 76 69 6e 31
tab 0, row 4, @0x1f57
tl: 13 fb: --H-FL-- lb: 0x0  cc: 2
col  0: [ 2]  c1 06
col  1: [ 6]  61 6c 76 69 6e 31
end_of_block_dump   研究下怎么看!

我知道应该是第三行被删了 ,应该看这里   (为什么看这里,而不是 row 2??????????)
tl: 2 fb: --HDFL-- lb: 0x2
tab 0, row 3, @0x1f64

另起一窗口 进入bbed ,'/home/oracle/bbed.par'为参数文件路径
bbed parfile=/home/oracle/bbed.par

//用info查看我们要恢复的数据所在的数据文件是不是在bbed的filelist.txt参数中,在里面才能做
BBED> info
 File#  Name                                                        Size(blks)
 -----  ----                                                        ----------
     4  /u01/app/oracle/oradata/orcl/users01.dbf                           640
     5  /home/oracle/tbs01.dbf                                             640

//找出文件号和块号  (如果我不知道文件号和块号,怎么找?有待研究)
BBED> set file 5 block 20
        FILE#           5
        BLOCK#          20
//找出删除的行 rowid  2 从跟踪文件知道!
BBED>  p *kdbr[2]
rowdata[26]
-----------
ub1 rowdata[26]                             @8149     0x3c

//把偏移量为 8164的块dump出来
BBED> d /v offset 8149 count 16
 File: /home/oracle/tbs01.dbf (5)
 Block: 20      Offsets: 8149 to 8164  Dba:0x01400014
-------------------------------------------------------
 3c020202 c1040661 6c76696e 312c0002 l <...�..alvin1,..

 <16 bytes per line>

//设置成更改模式
set mode edit

//把偏移量为8149的行修改成2C
BBED> modify /x 2c offset 8149
 File: /home/oracle/tbs01.dbf (5)
 Block: 20               Offsets: 8149 to 8164           Dba:0x01400014
------------------------------------------------------------------------
 2c020202 c1040661 6c76696e 312c0002

 <32 bytes per line>

//打印出来看看是否已经修改
BBED> p *kdbr[2]
rowdata[26]
-----------
ub1 rowdata[26]                             @8149     0x2c

//看看是不是正常的 2c
BBED> d /v offset 8149 count 16
 File: /home/oracle/tbs01.dbf (5)
 Block: 20      Offsets: 8149 to 8164  Dba:0x01400014
-------------------------------------------------------
 2c020202 c1040661 6c76696e 312c0002 l ,...�..alvin1,..

 <16 bytes per line>

//使修改生效
BBED> sum dba 5,20 apply
Check value for File 5, Block 20:
current = 0xc2fa, required = 0xc2fa


在第一个删除数据的端口,检查数据是不是回来了。

 select * from scott.t;   -------------这个时候还没看到数据,因为还是读内存的数据所以
 alter system flush buffer_cache;     --------重心加载内存
 select * from scott.t;      ---------------可以看数据回来了。


SQL>  select * from scott.t;

         X NAME
---------- ----------------------------------------
         1 alvin1
         2 alvin1
         3 alvin1
         4 alvin1
         5 alvin1

很幸运,数据回来了!

 

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值