很久以前做的实例,现在重新整理一下。
假设我们要传输下面的表空间:
Tablespace |
Datafile |
licz_1 |
/oradata/orcl/licz01.dbf |
licz_2 |
/oradata/orcl/licz02.dbf |
步骤1:确定系统是否支持和字节串是支持传输表空间
这个步骤适应于不于系统间的表空间的传输,如果是相同系统平台则不需要这步,否则用下面的查询判断表空间传输是否支持:
SELECT d.PLATFORM_NAME, ENDIAN_FORMAT
FROM V$TRANSPORTABLE_PLATFORM tp, V$DATABASE d
WHERE tp.PLATFORM_NAME = d.PLATFORM_NAME;
源系统查询结果:
PLATFORM_NAME ENDIAN_FORMAT
------------------- -------------------
Linux IA (32-bit)Little
目标系统查询结果:
PLATFORM_NAME ENDIAN_FORMAT
------------------------------- --------------
Microsoft Windows IA (32-bit)Little
注意:我们看到查询结果是两个系统PLATFORM_NAME和ENDIAN_FORMAT的bit和ENDIAN_FORMAT是相同,所以这两个平台间可以相互表空间传输,不需要转换表空间集,否则要需要转换表空间集。
步骤2:选择一个独立的表空间集
在这可传输集的外面可能存在逻辑或物理对象信赖,你只能传输一个独立的表空间集,下面情况是违反表空间集的独立性的:
l 一个索引在这个表空间里而这个表在表空间的外部,注意:如果表空间中的表相应的索引在表空间的外面,这不违例
l 分区表的一部分在表空间集里
l 一个参照完整性约束在表上。当在传输表空间集时,你可以选择是否包括完整性约束,如果你不考虑传输约束,这表空间的独立性不受影响,否则这是违例的
l 在表空间中有指向外部的lob字段
l An XML DB schema (*.xsd) that was registered by user A imports a global schema that was registered by user B, and the following is true: the default tablespace for user A is tablespace A, the default tablespace for user B is tablespace B, and only tablespace A is included in the set of tablespaces.
确定是否是一个独立的表空间集,可调用oracle提供的DBMS_TTS包中的TRANSPORT_SET_CHECK过程,但你必需有执行这个包的权限(要通过SYS用户赋予)
当你调用这个TRANSPORT_SET_CHECK过程时,你要指定要传输的表空间列表,检查自身的牵制策略,你选择是否包含约束。对于精确或全部的牵制,你必需也要设置TTS_FULL_CHECK参数为 TRUE
使用下面的语句确定表空间是否是独立的,参考完整性约束是被考虑(指示为TRUE)
EXECUTE DBMS_TTS.TRANSPORT_SET_CHECK('licz_1,licz_2', TRUE);
调用完过程之后, 可以通过TRANSPORT_SET_VIOLATIONS视图查询所有违例情况,如果表空间是独立的,则视图为空。下面的结果查询有两种违例:
SQL> SELECT * FROM TRANSPORT_SET_VIOLATIONS;
VIOLATIONS
------------------------------------------------------------------
Constraint DEPT_FK between table JIM.EMP in tablespace SALES_1 and table
JIM.DEPT in tablespace OTHER
Partitioned table JIM.SALES is partially contained in the transportable set
违例的情况必需被解决才能进行下面的步骤。
步骤3:创建一个传输的表空间集
任何相应的权限的用户都可以执行这步,但是你必需有EXP_FULL_DATABASE角色,去执行传输表空间的导出操作。
在确保表空间是一个独立的后,可以执行下面的步骤:
1、 使所有要copy的表设为只读
SQL> ALTER TABLESPACE licz_1 READ ONLY;
Tablespace altered.
SQL> ALTER TABLESPACE licz_2 READ ONLY;
Tablespace altered.
2、 调用数据泵工具生成导出文件
$expdp system/oracle DUMPFILE=expdat.dmp DIRECTORY=dpump_dir
TRANSPORT_TABLESPACES = licz_1,licz_2
注意:如果表空间里有XML类型,必需用exp工具代替expdp
如果你想用一个精确的检查方式执行表空间传输操作,请用TRANSPORT_FULL_CHECK参数,下面例子:
expdp system/password DUMPFILE=expdat.dmp DIRECTORY = dpump_dir
TRANSPORT_TABLESPACES=licz_1,licz_2 TRANSPORT_FULL_CHECK=Y
注意:expdp仅仅是导出表空间的数据字典结构,所以导出速度是很快的,甚至是大的表空间集。
如果licz_1,licz_2要传输到不同的系统平台,并且endianness是不同的,在你传输表空间这前要转换表空间的数据文件的格式。执行下面的操作:
3、 转换表空间数据文件
[oracle@localhost orcl]$ rman target /
Recovery Manager: Release 10.2.0.1.0 - Production on Mon Apr 20 15:10:04 2009
Copyright (c) 1982, 2005, Oracle. All rights reserved.
connected to target database: ORCL (DBID=1168223555)
RMAN> CONVERT TABLESPACE licz_1,licz_2 TO PLATFORM 'Microsoft Windows IA (32-bit)'FORMAT '/oracle/temp/%U';
Starting backup at 20-APR-09
using channel ORA_DISK_1
channel ORA_DISK_1: starting datafile conversion
input datafile fno=00038 name=/oradata/orcl/licz01
converted datafile=/oracle/temp/data_D-ORCL_I-1168223555_TS-LICZ_1_FNO-38_03kcv104
channel ORA_DISK_1: datafile conversion complete, elapsed time: 00:00:03
channel ORA_DISK_1: starting datafile conversion
input datafile fno=00039 name=/oradata/orcl/licz02
converted datafile=/oracle/temp/data_D-ORCL_I-1168223555_TS-LICZ_2_FNO-39_04kcv108
channel ORA_DISK_1: datafile conversion complete, elapsed time: 00:00:01
Finished backup at 20-APR-09
RMAN> exit
Recovery Manager complete.
步骤4:传输表空间集
传输上面两个数据文件和dmp文件到目标数据库相应的目录下。
如果源和目标系统平台是文件系统,你可以用下面的方法传输文件:
a. 直接copy(copy命令或ftp)
b. 用DBMS_FILE_TRANSFER 包(没有用过)
c. RMAN工具
d. 用CD盘
如果你已经把表空间的数据文件传输到了一个endianness不同的系统平台,但是在这之前你没转换数据文件的endianness。你可以现在在目标系统上做下面的转换操作:
RMAN> CONVERT DATAFILE
2> '/hq/finance/work/tru/tbs_31.f',
3> '/hq/finance/work/tru/tbs_32.f',
4> '/hq/finance/work/tru/tbs_41.f'
5> TO PLATFORM="Solaris[tm] OE (32-bit)"
6> FROM PLATFORM="HP TRu64 UNIX"
7> DB_FILE_NAME_CONVERT=
8> "/hq/finance/work/tru/", "/hq/finance/dbs/tru"
9> PARALLELISM=5;
步骤5:导入表空间集
注意:
如果你传输的表空间的块大小和接收的数据库的标准的块大小是不同的,你必需设置接收数据库的DB_nK_CACHE_SIZE参数。
例如:如果你要传输的表空间块大小为8K,接收的数据库的块大小为4K,然后你必需包含一个DB_8K_CACHE_SIZE的参数在这参数文件里,如果在参数文件里没有包含它,可以用ALTER SYSTEM SET 命令修改。
1、 用数据泵impdp工具导入数据
注意:如果表空间包含XML类型,你必需用IMP工具
impdp system/oracle DUMPFILE=expdat.dmp DIRECTORY=dpump_dir
TRANSPORT_DATAFILES=/salesdb/licz_101.dbf,/salesdb/licz_201.dbf
REMAP_SCHEMA=(dcranney:smith) REMAP_SCHEMA=(jfee:williams)
参数说明:
l DUMPFILE参数指定导出文件的元数据
l DIRECTORY参数指定文件dmp文件所在目录
l TRANSPORT_DATAFILES参数指定表空间所包含数据文件
l REMAP_SCHEMA参数指定改变数据库对象的拥有者,如果你不指定REMAP_SCHEMA,所有的数据库对(如表和索引)将创建在源数据库中同样的用户方案下,并且这些用户已经在目标数据中存在,如果不存在导入会报错。上面的例子:在源数据库里对象在dcranney用户方案里,要导入到目标数据库的smith用户下;后面的参数一样。在这种情况下,目标数据库必需有smith、williams,而不需要有dcranney、jfee用户。
在这个语句执行成功后,所有表空间还是只读模式,检查输入日志看是否有错误发生。
当在很多的数据文件的情况下,在地导入语句中指定数据文件名字列表是费时的一个工作。更甚至超过语句行的限制,这种情况你能用一个输入参数文件,例如,调用数据泵用下面的语句:
IMPDP system/password PARFILE='par.f'
这个PARFILE参数里的par.f内容如下:
DIRECTORY=dpump_dir
DUMPFILE=expdat.dmp
TRANSPORT_DATAFILES="'/db/sales_jan','/db/sales_feb'"
REMAP_SCHEMA=dcranney:smith
REMAP_SCHEMA=jfee:williams
2、 如果需要的话,把表空间改成read/write模式
ALTER TABLESPACE licz_1 READ WRITE;
ALTER TABLESPACE licz_2 READ WRITE;
注意:oracle低版本向高版本导入时可能会出现问题,我就遇到这样的情况
Version 10.2.0.1.0 到 Version 10.1.0.2.0,可能是版本的原因:
C:\Documents and Settings\Administrator>IMPDP system/oracle DUMPFILE=expdat.dmp
DIRECTORY=dpump_dir TRANSPORT_DATAFILES=d:\test\licz01,d:\test\licz01
Import: Release 10.1.0.2.0 - Production on 星期一, 20 4月, 2009 17:48
Copyright (c) 2003, Oracle. All rights reserved.
连接到: Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 - Production
With the Partitioning, OLAP and Data Mining options
ORA-39001: 参数值无效
ORA-39000: 转储文件说明错误
ORA-31619: 转储文件 "D:\test\expdat.dmp" 无效