阅读 135

BBED系列之实践(3.3)--使用copy命令从旧数据文件中恢复delete的rows

使用copy命令从旧数据文件中恢复delete的rows

将表scott.emp移动到我们的单独的datafile里:

col tablespace_name for a15

select tablespace_name,contents,status from dba_tablespaces;


col name for a50

select file#,name from v$datafile;


create tablespace lxtbs datafile '/u01/app/oracle/oradata/PROD/disk3/lxtbs01.dbf' size 50m;


alter table scott.emp move tablespace lxtbs;

alter index scott.pk_emp rebuild tablespace lxtbs;


col table_name for a10

select table_name,tablespace_name,blocks from dba_tables where owner='SCOTT';


select * from scott.emp;


select file#||' '||name||' '||bytes from v$datafile;


  1. 创建一个旧的数据文件

shutdown immediate;


关库后再操作:

cp /u01/app/oracle/oradata/PROD/disk3/lxtbs01.dbf /home/oracle

cd /home/oracle

ls


将copy 的bak datafile 添加到bbed 的parfile里面

vi file.txt

添加:

6 /u01/app/oracle/oradata/PROD/disk3/lxtbs01.dbf 52428800

7 /home/oracle/lxtbs01.dbf 52428800


最后的7号文件是我们添加的。

 

startup


 

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 scott.emp;


col owner for a10

col segment_name for a10

select owner,segment_name,header_file,header_block,blocks from dba_segments where owner='SCOTT';


从这个查询结果,我们可以看到,对象保存在datafile 6里,从130 的block 开始存储,占用8个blocks。

       这里要注意的一点是:dba_segments 视图里的block 是从0开始的统计的,而bbed 里是从1. 所以我们在bbed中指定block时,需要加1(130会报错),也就是131

quit

bbed parfile=/home/oracle/bbed.par

blockedit


下面能查出东西来就行。

set dba 6,130 offset 0

p ktbbh


set dba 6,131 offset 0

p ktbbh



做一个误删除操作:

delete from scott.emp;

commit;

select * from scott.emp;


  1. 使用copy 从旧的datafile里恢复

set width 70

info


其中7是我们的旧的数据文件。

copy dba 7,131 to dba 6,131


copy剩下的7个块:

copy dba 7,132 to dba 6,132

copy dba 7,133 to dba 6,133

copy dba 7,134 to dba 6,134

copy dba 7,135 to dba 6,135

copy dba 7,136 to dba 6,136

copy dba 7,137 to dba 6,137

copy dba 7,138 to dba 6,138

sum apply


alter system flush buffer_cache;

select * from scott.emp;


如果出不来就再做一遍copy,数据就回来了,或者重启db数据也能回来。

但是:

select count(*) from scott.emp;


需要再move一次。

alter table scott.emp move tablespace users;

alter index scott.pk_emp rebuild tablespace users;

alter table scott.emp move tablespace lxtbs;

alter index scott.pk_emp rebuild tablespace lxtbs;


select count(*) from scott.emp;


文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐