oracle rman表空间传输,oracle小知识点12--传输表空间通过rman

传输表空间可通过rman,imp/exp或impdp/expdp去实现,以下通过rman实现.

os: centos 6.6

db version:11.2.0.4.0

以下测试:

##方便测试,源库和目标库为同一个库

##源库

[oracle@ct6605 ct66]$ sqlplus / as sysdba

##建立要传输的test表空间

SQL> create tablespace test datafile '/u02/oradata/ct66/test01.dbf' size 10m ;

[oracle@ct6605 ct66]$ rman target /

##备份数据库用于自动辅助实例使用

RMAN> backup database;

[oracle@ct6605 ct66]$ sqlplus / as sysdba

##在test表空间下建表scott.test01

SQL> create table scott.test01 tablespace test as select 1 i from dual;

##在users表空间下建表scott.test01的索引scott.idx_testtts_01

SQL> create index scott.idx_testtts_01  on scott.test01(i) tablespace users;

##查询表

SQL> select * from scott.test01;

/*

I

1

*/

##切换日志.切换日志是为了演示还原传输表空间在某个日志序列

SQL> alter system switch logfile;

##查看当前日志序列

SQL> select sequence# from v$log where status='CURRENT';

/*

SEQUENCE#

41

*/

##往表scott.test01插入数据

SQL> insert into scott.test01 select 2 from dual;

SQL> commit;

##查询表

SQL> select * from scott.test01;

/*

I

1

2

*/

##切换日志

SQL> alter system switch logfile;

##查看当前日志序列

SQL> select sequence# from v$log where status='CURRENT';

/*

SEQUENCE#

42

*/

##确认平台的版本和endian format是否支持

##这里因为测试在同一个库,肯定是支持.如果两个库的endian format不同,是需要有转换的步骤

SQL> select  b.name,i.version,b.platform_name, a.ENDIAN_FORMAT

from v$transportable_platform a,v$database b,v$instance i

where a.PLATFORM_ID=b.PLATFORM_ID;

/*

NAME    VERSION    PLATFORM_NAME    ENDIAN_FORMAT

CT66    11.2.0.4.0    Linux x86 64-bit    Little

*/

##确认表空间test是否是自包含

SQL> begin

dbms_tts.transport_set_check('test', true,true);

end;

/

##因为前面把表scott.test01的索引建在了users表空间下,这里查询出来不是自包含

SQL> select * from transport_set_violations;

VIOLATIONS

ORA-39907: Index SCOTT.IDX_TESTTTS_01 in tablespace USERS points to table SCOTT.TEST01 in tablespace TEST.

##重建索引到test表空间

SQL> alter index scott.idx_testtts_01 rebuild tablespace test;

##再次查检表空间的自包含

SQL> begin

dbms_tts.transport_set_check('test', true,true);

end;

##已经满足

SQL> select * from transport_set_violations;

VIOLATIONS

[oracle@ct6605 ct66]$ rman target /

##生成test表空间传输集.只要此一条命令即可.

RMAN> transport tablespace 'TEST'

tablespace destination '/home/oracle'

auxiliary destination '/home/oracle'

until logseq 41;

##查看产生的导入脚本,表空间元数据dmp和数据文件.

[oracle@ct6605 ~]$ cd /home/oracle

[oracle@ct6605 ~]$ ls

CT66  dmpfile.dmp  impscrpt.sql  test01.dbf

##目标库

##此处因为测试,源库和目标库为同一个库,先删除原有的test表空间.

[oracle@ct6605 ct66]$ sqlplus / as sysdba

SQL> drop tablespace test including contents and datafiles;

##通过脚本导入.此处可以根据自己的需要修改脚本再执行,例如需要把test01.dbf移到数据文件目录.当然也可以不用导入脚本,通过impdp手动导入dmpfile.dmp和test01.dbf.

[oracle@ct6605 ~]$ sqlplus / as sysdba @impscrpt.sql

##查询表确认已经导入

[oracle@ct6605 ct66]$ sqlplus / as sysdba

SQL> select * from scott.test01;

/*

I

1

*/

备注:

1.rman基于表空间的传输,可以不用象impdp/expdp方式将源库表空间暂时read only即可

2.生成传输集之前不一定需要backup database,一般只需要备份system,sysaux,undo表空间和要传输的表空间即可.

3.通过rman实现,原理和tspitr相似,都是通过自动辅助实例,在辅助实例上还原出需要的表空间.和tspitr不同的是,tspitr自动通过impdp/expdp还原到源库,而rman tts只是生成需要导入的脚本,

表空间元数据dmp和数据文件.

4.rman的transport 命令生成表空间传输集时,可能会报RMAN-06024: no backup or copy of the control file found to restore,和其它基于自动辅助实例clone 还原时报这个错误一样,检查自动

脚本 set until  scn 的值是否是小于我们已有的备份控制文件Ckp_SCN值,然后再做相应处理.

5.rman的transport 命令生成表空间传输集时,会对要传输的表空间做自包含验证,如果不通过无法执行.测试发现,就算是你要生成的表空间集是之前的没有自包含的时间点,只要源库当前是自

包即可.只是生成的传输集导入之后,自然不在此表空间的依赖对象不会导入.

6.除了用于表空间的迁移,个人觉得它比较实用的一点是,若用户误删除了数据,无法通过各种闪回机制还原时.通过rman的transport生成基于时间的传输表空间,导入到测试库,再把删除的数据

导出来.比手动建立一个临时不完全恢复的库要自动化,比tspitr虽自动化但直接覆盖源库表空间要实用.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值