通过RMAN的Transportable平台间转移数据

首先查看可以使用RMAN的transportable功能的平台:

SQL> COLUMN PLATFORM_NAME FORMAT A32
SQL> SELECT * FROM V$TRANSPORTABLE_PLATFORM;

PLATFORM_ID PLATFORM_NAME ENDIAN_FORMAT
----------- -------------------------------- --------------
1 Solaris[tm] OE (32-bit) Big
2 Solaris[tm] OE (64-bit) Big
7 Microsoft Windows IA (32-bit) Little
10 Linux IA (32-bit) Little
6 AIX-Based Systems (64-bit) Big
3 HP-UX (64-bit) Big
5 HP Tru64 UNIX Little
4 HP-UX IA (64-bit) Big
11 Linux IA (64-bit) Little
15 HP Open VMS Little
8 Microsoft Windows IA (64-bit) Little
9 IBM zSeries Based Linux Big
13 Linux 64-bit for AMD Little
16 Apple Mac OS Big
12 Microsoft Windows 64-bit for AMD Little
17 Solaris Operating System (x86) Little

在以上的支持的平台列表中,如果source platform和target platform平台版本不一致的话就还需要额外的步骤就是在source platform和target platfrom平台上执行convert,在开始转储之前。

当然如果你的目标平台和源平台都一样的话以上步骤就可以免去了。

[@more@]

此功能的限制

1、两个平台的字符集应该一致

2、如果目标平台和源平台的表空间将要转储的表空间名称有一致的那么也不行,但是你可以通过修改两边平台的任意一个的表空间名来避免这种问题的存在。

3、所有的对象应该都在将要转储的表空间内

4、将要转储的表空间所属局schema必须也在目标平台上存在

5、如果所要转储的表空间内包含XMLType类型的数据,那么在转储的工具的选择上你只能使用EXP和IMP不能使用10g提供的数据泵工具,如果你使用的EXP和IMP那么在转储的时候不要忘了将CONSTRAINTS 和TRIGGERS 两个参数设置为Y。

可以通过以下的查询,找出是否包含XMLType:

select distinct p.tablespace_name
from dba_tablespaces p, dba_xml_tables x, dba_users u, all_all_tables t
where t.table_name=x.table_name and
t.tablespace_name=p.tablespace_name and
x.owner=u.username

转储包含XMLType类型的表空间时,包含了以下的一些限制:

a、目标库内也要安装了XML DB

B、schema所引用的XMLType表不能是XML DB的标准schema

c、schema所引用的XMLType表,不能包含cyclic dependencies.
d、一些行级的加密数据可能在imp的时候丢失

e、如果所要传输的XMLType类型的表所引用的schema没有声明,那么在导入的时候就会自动创建并注册,但是如果要传入的库内已经存在了对应的schema那么如果你没有指定ignore=y的情况下就会报错

5、含有高级队列的表空间不能兼容8.0-compatible

6、你不能传输SYSTEM表空间以及属于SYS用户的对象。

7、那些不透明的对象例如:such as RAW, BFILE, and the AnyTypes也可以被传输,但是传输的时候将不会有平台之间的convert,

8、浮点数也可以被传输,但是要使用10g提供的数据泵工具而不是原始的EXP工具。

=======================================

传输EXP/IMP ASM表空间:

*使用RMAN进行CONVER

对于传输ASM文件来说 没有直接的办法,可以通过RMAN来完成:

执行以下步骤:

1、预处理将要导出的表空间:

*检查表空间内的对象是否都属于要传输的对象

SQL>execute sys.dbms_tts.transport_set_check('TBS1,TBS2', true);
SQL> select * from sys.transport_set_violations;

如果有输出,则在传输之前必须将这些问题解决掉。

* 将要传输的表空间置为只读模式

SQL> ALTER TABLESPACE TBS1 READ ONLY;
SQL> ALTER TABLESPACE TBS2 READ ONLY;

2、导出基础数据


*使用原始的工具导出

exp userid='sys/sys as sysdba' file=tbs_exp.dmp log=tba_exp.log
transport_tablespace=y tablespaces=TBS1,TBS2
*使用数据泵工具导出

CREATE OR REPLACE DIRECTORY dpump_dir AS '/tmp/subdir' ;
GRANT READ,WRITE ON DIRECTORY dpump_dir TO system;

expdp system/password DUMPFILE=expdat.dmp DIRECTORY=dpump_dir
TRANSPORT_TABLESPACES = TBS1,TBS2
如果你想同时对要转出的表空间进行一次严格的检查可以加入如下参数:TRANSPORT_FULL_CHECK parameter:

expdp system/password DUMPFILE=expdat.dmp DIRECTORY = dpump_dir
TRANSPORT_TABLESPACES= TBS1,TBS2 TRANSPORT_FULL_CHECK=Y

如果要转出的表空间里面包含的并非完全是当前要转出的schema的数据,那么就会有错误报出。

3、查找目标平台的平台名

可以通过查询V$TRANSPORTABLE_PLATFORM 来得到目标数据库平台的平台名:

SELECT tp.platform_id,substr(d.PLATFORM_NAME,2,30), ENDIAN_FORMAT
FROM V$TRANSPORTABLE_PLATFORM tp, V$DATABASE d
WHERE tp.PLATFORM_NAME = d.PLATFORM_NAME;

4、生成系统级的文件以便进行转储

RMAN> CONVERT TABLESPACE TBS1
TO PLATFORM 'HP-UX (64-bit)' FORMAT '/tmp/%U';
RMAN> CONVERT TABLESPACE TBS2
TO PLATFORM 'HP-UX (64-bit)' FORMAT '/tmp/%U';

5、将上面生成的文件拷贝到目标平台

6、导入以上导出的文件到目标平台

*使用原始的工具:

imp userid='sys/sys as sysdba' file=tbs_exp.dmp log=tba_imp.log
transport_tablespace=y datafiles='/tmp/....','/tmp/...'
*使用数据泵工具:

CREATE OR REPLACE DIRECTORY dpump_dir AS '/tmp/subdir' ;
GRANT READ,WRITE ON DIRECTORY dpump_dir TO system;

impdp system/password DUMPFILE=expdat.dmp DIRECTORY=dpump_dir
TRANSPORT_DATAFILES='/tmp/....','/tmp/...'
REMAP_SCHEMA=(source:target) REMAP_SCHEMA=(source_sch2:target_schema_sch2)

如果你要导入的schema不是你当初导出的schema那么你可以通过REMAP_SCHEMA来进行转换。

7、设置表空间为读写模式

SQL> ALTER TABLESPACE TBS1 READ WRITE;
SQL> ALTER TABLESPACE TBS2 READ WRITE;

如果你仅仅是将ASM的表空间转储到普通的文件系统,那么执行完以上的步骤后工作就算完成,但是如果你是将ASM的表空间转储到其他ASM上那么还要继续一下的工作。

8、通过RMAN拷贝以上的数据文件到ASM内:

rman nocatalog target /
RMAN> backup as copy datafile '/tmp/....dbf' format '+DGROUPA';

+DGGROUPA是ASM的名字

9、切换到新拷贝的数据文件

如果10g的数据库是open状态的,那么你首先要将数据文件offline:

SQL> alter database datafile '/tmp/....dbf' offline;

进行切换:

rman nocatalog target /
RMAN> switch datafile '/tmp/....dbf' to copy;
以下的是列出了拷贝后生成的新的文件:

# ex. '+DGROUPA/s101/datafile/tts.270.5'

10、设置数据文件为online模式,但是首先需要对其进行恢复:

SQL> recover datafile '+DGROUPA/s101/datafile/tts.270.5';
SQL> alter database datafile '+DGROUPA/s101/datafile/tts.270.5' online;
11、查看是否新拷贝的数据文件已经在数据文件列表:

SQL> select name, status from v$datafile;
+DGROUPA/s101/datafile/tts.270.5 ONLINE






请使用浏览器的分享功能分享到微信等