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
很幸运,数据回来了!