传输表空间(tansport tablespace)用于将表空间从一个数据库传输到另一个数据库,速度快,相当于直接复制数据文件.传输表空间有以下特性:
1)可以传输一个表空间集合
2)将表空间设置成read-only模式传输或者用RMAN做可传输的表空间
3)字典管理和本地管理的表空间均可传输
4)从9I开始,要传输的表空间的块大小可与目标数据库的标准块大小不同
5)传输表空间比imp exp快的多,不需要抽取和加载数据,数据包含在表空间中,用数据泵转换元数据(从11GR1开始,必须要用数据泵转换元数据)
6)从10G开始,可以跨平台传输,视图 V$TRANSPORTABLE_PLATFORM显示哪些平台可以互相转换及大小端.如果平台的大小端不同,必须要转换
限制:
1)源平台与目标平台字符集相同;或者源平台字符集是目标平台字符集的严格子集,并且源数据库兼容性是10.1.0.3
2)要传输的表空间不能与目标数据库表空间重名
3)表空间上有加密的表时不能传输,必须用数据泵导入这些对象,再导入到目标数据库
4)不能传输SYSTEM表空间或sys的对象
5)如果要传输的表空间上的表有TIMESTAMP WITH TIMEZONE的列,则源数据库和目标数据库时区必须相同.
两种方式实现传输表空间:EM或手工.
以下为手工传输步骤:
1.查询V$TRANSPORTABLE_PLATFORM视图确定可转换的平台和大小端
2.检查表空间是否是自包含的
3.在源数据库将表空间置于read-only模式,导出表空间元数据.
4.将数据文件和导出文件复制到目标主机上,如果源平台与目标平台大小端不同,转换表空间
5.可选步骤,将源数据库表空间设置为read/write模式
6.导入表空间到目标数据库
实验,从linux平台迁移到window上:
1.检查源数据库和目标数据库
创建表空间tansport_ts,数据文件tans01.dbf
SQL> CREATE TABLESPACE tansport_ts DATAFILE '/oracle/oradata/orcl/tans01.dbf' SIZE 5M;
Tablespace created
创建一个表,插入数据
CREATE TABLE kdzr.transport (ID INT) TABLESPACE tansport_ts;
SQL> insert into kdzr.transport values(1);
1 row inserted
SQL> insert into kdzr.transport values(2);
1 row inserted
SQL> insert into kdzr.transport values(3);
1 row inserted
SQL> insert into kdzr.transport values(4);
1 row inserted
SQL> commit;
在源数据库和目标数据库上执行以下查询
目标数据库:
16:02:15 SQL> SELECT A.*
2 FROM V$TRANSPORTABLE_PLATFORM A, V$DATABASE B
3 WHERE A.PLATFORM_ID = B.PLATFORM_ID;
PLATFORM_ID PLATFORM_NAME ENDIAN_FORMAT
----------- ---------------------------------------------- --------------
12 Microsoft Windows x86 64-bit Little
源数据库:
SQL> SELECT a.* FROM v$transportable_platform a ,V$database b
2 WHERE a.PLATFORM_ID=b.PLATFORM_ID;
PLATFORM_ID PLATFORM_NAME ENDIAN_FORMAT
----------- --------------------------------------------------- --------------
13 Linux 64-bit for AMD Little
发现linux和windows大小端相同,不需要转换.
2.检查表空间是否是自包含的
自包含指表空间上的对象不依赖对其他表空间的对象.
执行以下过程检查表空间tansport_ts是否是自包含的:
EXECUTE DBMS_TTS.TRANSPORT_SET_CHECK('tansport_ts', TRUE);
执行完后执行以下查询:
SQL> SELECT * FROM TRANSPORT_SET_VIOLATIONS;
VIOLATIONS
----------------------------------------------
为空说明表空间不依赖于其它表空间.
3.将表空间tansport_ts设置为read-only,导出表空间元数据
SQL> alter tablespace tansport_ts read only;
Tablespace altered
导出表空间元数据:
expdp system dumpfile=expdat.dmp directory=data_pump_dir transport_tablespaces=tansport_ts
4.将表空间拷到目标主机上
SQL> SELECT A.file_name FROM dba_data_files a WHERE a.tablespace_name=UPPER('tansport_ts');
Warning: connection was lost and re-established
FILE_NAME
--------------------------------------------------------------------------------
/oracle/oradata/orcl/tans01.dbf
表空间对应的数据文件为/oracle/oradata/orcl/tans01.dbf.
把表空间拷到目标主机的DATA_PUMP_DIR
SQL> SELECT a.directory_path FROM dba_directories a WHERE a.directory_name='DATA_PUMP_DIR';
DIRECTORY_PATH
--------------------------------------------------------------------------------
D:\app\wj/admin/orcl/dpdump/
D:\app\wj\admin\orcl\dpdump 的目录
2014-08-27 21:54 <DIR> .
2014-08-27 21:54 <DIR> ..
2014-08-25 11:41 120 dp.log
2014-08-27 21:45 69,632 expdat.dmp
2014-08-27 21:44 5,251,072 tans01.dbf
可以看到表空间数据文件和相应的元数据已经复制到目标主机上.
如果源和目标主机大小端不同,需要用RMAN转换
例如:
RMAN> CONVERT DATAFILE
2>'C:\Temp\sales_101.dbf',
3>'C:\Temp\sales_201.dbf'
4>TO PLATFORM="Microsoft Windows IA (32-bit)"
5>FROM PLATFORM="Solaris[tm] OE (32-bit)"
6>DB_FILE_NAME_CONVERT=
7>'C:\Temp\', 'C:\app\orauser\oradata\orawin\'
8> PARALLELISM=4;
5.导入表空间
用数据泵将表dump文件和数据文件导入到目标数据库中
C:\Users\wj>impdp SYSTEM/system dumpfile=expdat.dmp DIRECTORY=data_pump_dir transport_datafiles=D:\app\wj\admin\orcl\dpdump\tans01.dbf remap
_schema=kdzr:scott LOGFILE=transport.log VERSION=10.2.0.1.0
Import: Release 11.2.0.1.0 - Production on 星期三 8月 27 22:17:40 2014
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
连接到: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
已成功加载/卸载了主表 "SYSTEM"."SYS_IMPORT_TRANSPORTABLE_01"
启动 "SYSTEM"."SYS_IMPORT_TRANSPORTABLE_01": SYSTEM/******** dumpfile=expdat.dmp DIRECTORY=data_pump_dir transport_datafiles=D:\app\wj\admi
n\orcl\dpdump\tans01.dbf remap_schema=kdzr:scott LOGFILE=transport.log VERSION=10.2.0.1.0
处理对象类型 TRANSPORTABLE_EXPORT/PLUGTS_BLK
处理对象类型 TRANSPORTABLE_EXPORT/TABLE
处理对象类型 TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK
作业 "SYSTEM"."SYS_IMPORT_TRANSPORTABLE_01" 已于 22:17:44 成功完成
注意:如果用高版本的数据泵导入低版本的DUMP,要加上version参数,否则导入出错.version可以查询源数据库的v$version视图得到.
验证导入的表:
SQL> SELECT * FROM scott.TRANSPORT;
ID
---------------------------------------
1
2
3
4
自从导入成功.