一、简介
可传输表空间(还有个集)最大的优势是其速度比export/import或unload/load要快的多。因为可传输表空间主要是复制数据文件到目标路径,然后再使用export/import或Data Pump export/import等应用仅导出/导入表空间对象的元数据到新数据库。
(1)可传输表空间的特性主要用于进行库对库的表空间复制,要进行传输的表空间必须置于read-only模式。如果生产库不允许表空间置为只读模式,没关系,方法还是有的,通过RMAN备份也可以创建可传输表空间集。
(2)要使用可传输表空间的特性,oracle至少是8i企业版或更高版本。如果是相同操作系统平台相互导入,则8i及以上版本均可支持,但如果是不同操作系统平台,数据库版本至少10g。
(3)被传输的表空间即可以是字典管理,也可以是本地管理。并且自oracle9i开始,被传输表空间的block size可以与目标数据库的block size不同。
一些操作系统(包括 Windows)在低位内存地址中用最低有效字节存储多字节二进制数据;因此这种系统被称为低地址低字节序。相反,其它的操作系统(包括 Solaris)将最高有效字节存储在低位内存地址中,因此这种系统被称为低地址高字节序。当一个低地址高字节序的系统试图从一个低地址低字节序的系统中读取数据时,需要一个转换过程— 否则,字节顺序将导致不能正确解释读取的数据。不过,当在相同字节顺序的平台之间传输表空间时,不需要任何转换。
如果平台间的endian不同,那么在执行导入操作之之前必须首先转换源平台的表空间到目标格式,如果平台间endian format相同,则可以跳过转换的步骤,即使是不同平台。当然前提是各平台的数据库版本都不低于10g。
在表空间可被传输到不同平台之前,数据文件的文件头必须能够识别其所属的原平台是什么,对于oracle数据库初始化参数中COMPATIBLE置为10.0.0或更高之后,你必须至少将表空间置为read-write一次,这点非常重要。
表空间传输是通过oracle的逻辑导出命令exp/imp添加参数transport_tablespace=y进行导出导入。
1.1、执行表空间传输有以下限制条件:
(1)源数据库和目标数据库必须处于相同的平台。10g以后可以用RMAN命令修改数据文件实现跨平台移动表空间。
(2)对于源数据库和目标数据库版本不同时,源数据库的版本必须低于目标数据库。
(3)两边设置的数据库字符集和国家字符集必须一致。
(4)目标数据库不能存在需要导入的表空间。
(5)源数据库和目标数据库的blocksize必须一致(9i前)。
注意:
自oracle10gR2开始,可以传输含XMLTypes的表空间,不过必须使用imp/exp而不能选择数据泵(impdp/expdp)。并确保imp/exp命令的CONSTRAINTS和TRIGGERS参数设置为Y。
下列脚本可以列出数据库中哪些表空间含XMLTypes:
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;
1.2、传输表空间的一些限制:
(1)高级队列(Advanced Queues):可传输表空间的特性并不支持8.0兼容的高级队列
(2)系统表空间(SYSTEM Tablespace Objects):不能传输SYSTEM表空间或者SYS用户拥有的对象。
(3)映射类型(Opaque Types):由应用指定并且映射到数据库(如RAW,BFILE等)的类型可以被传输,但是它们并不会被做为跨平台转换的一部分。其实际类型是什么只有指定它的应用清楚,所以必须保证这个应用解决读取各种endian问题后再考虑将其传输到新平台。
(4)浮点数据(Floating-Point Numbers):BINARY_FLOAT和BINARY_DOUBLE类型可以使用数据泵导入导出但不支持EXP。
注意:
对于跨平台的传输,查询V$TRANSPORTABLE_PLATFORM视图检查两平台的endian format。如果你准备传输表空间集到不同endian平台,必须首先转换表空间集的endian与目标平台相同。前面提到,如果涉及了endian的转换,可以在生成可传输表空间集时进行(源平台进行),或者在导入表空间集之前进行(目标平台进行),转换的命令都是一个,只是参数略有不同,关于命令的用法暂且不提,后面会有专门章节介绍和实践。在这里我们先来深入一个这个操作究竟放在哪里合适。按说这个操作放在哪里执行都可以,应该没有什么可争辩的,但是值的注意的是针对我们操作的数据库,特别是对于正在运行的生产数据库,三思建议你采用在目标平台上进行转换的操作,缘由如下:
(1)缩短停机时间
在创建可传输表空间集之前,需要将要传输的表空间状态置为read-only。你可以将数据文件迅速复制一份镜像,并生成包含元数据的export文件,然后即可将表空间状态置为read-write状态。这种安排使得表空间必须保持为只读的时间尽可能的短。
(2) 提高执行性能
生产数据库往往同时在处理多个应用,而此时如果再用其进行转换操作可能增加系统负载,并且系统此时由于执行的任务较多,转换效率也并非最高。将转换操作移到目标平台进行,通常对于目标平台都是做为备份角色,其系统负载相对是比较低的,执行转换操作的效率相对也会更高。
(3)简化复制操作
通过在目标平台执行转换命令时指定db_file_name_convert参数,直接将数据文件转换到目标目录内,简化复制时的操作。
二、表空间传输的步骤:
2.1、需要移动的表空间必须是自包含的。
如果表空间中的数据与其他表空间中的数据有参照关系,那么在移动表空间时,凡是相关的表空间都需要一同移动。、
可以通过如下命令检查是否为自包含表空间:
SQL>execute dbms_tts.transport_set_check(ts_list=>'<tablespace>',incl_constraints=>TRUE);
参数ts_list指定需要传输的表空间,incl_constraints指定是否检查完整性约束。执行完后,检查临时表transport_set_violations,如果没有返回信息,表示表空间为自包含。
2.2、将需要传输的表空间设置为只读。(如果是生成数据库也是可以有办法的,可以使用rman功能)
SQL>alter tablespace XXX read only;
如果生产库不允许表空间只读,可以选择通过RMAN备份生成表空间集的方式进行
2.3、以sysdba身份连接数据库执行exp导出。
C:>exp userid='sys/sys@jiong as sysdba' file=d:\testspace.dmp log=d:\testspaceexp.log transport_tablespace=y tablespaces=testspace buffer=10240000
只是导出的待传输表空间的目录结构信息(元数据),并不包含实际数据,因此导出的速度非常快,而且文件也很小
2.4、使用RMAN转换所要传输表空间的数据文件头为目标系统文件(10g下在不同的平台传输时)
这步转换可以在源数据库也可以在目标数据库进行。
RMAN>convert tablespace "TESTSPACE" to platform 'Microsoft Windows IA (32-bit)' format 'd:\TESTSPACE01.DBF'
记住这步结束后别忘了将表空间置回可写:
alter tablespace TESTSPACE read write
关于platform参数可以通过查询v$db_transportable_platform得到。
(1)v$db_transportable_platform
V$DB_TRANSPORTABLE_PLATFORM displays all platforms to which the database can be transported using the RMAN CONVERT DATABASE command. The transportable database feature only supports transports of the same endian platform. Therefore, V$DB_TRANSPORTABLE_PLATFORM displays fewer rows than V$TRANSPORTABLE_PLATFORM.
(2)v$transportable_platform
V$TRANSPORTABLE_PLATFORM displays all platform names and their identifiers
2.5、复制表空间转换后的数据文件及导出文件到目标平台
2.6、使用imp导入表空间
这里需要注意,在目标数据库需要先建立原先表空间里对象所属的用户,但是又不能使用同名的表空间,所以这个用户会建立在其他表空间上。
还有,如果传输的表空间集block_size与目标库的默认block_size不同,那你的第一步就得是设置目标库中DB_nK_CACHE_SIZE的初始化参数(9i以上)。
c:>imp userid='sys/sys@mood as sysdba' file=d:\testspace.dmp log=d:\testspaceimp.log tablespaces=testspace datafiles=d:\TESTSPACE01.DBF transport_tablespace=y
将用户默认表空间修改为导入的表空间:
alter user TUSER default tablespace TESTSPACE
如果需要,将导入到目标数据库的表空间置为可写,因为导入后也是处于read only状态。
alter tablespace TESTSPACE read write
#####################################################
创建传输表空间测试
##############################################
一、测试环境
Source 端:
操作系统: OracleLinux 6.2 64位
endianness格式: little
数据库版本:11.2.0.3
Target 端:
操作系统:OracleLinux 6.2 64位
endianness 格式: little
数据库版本:11.2.0.3
二、开始测试
2.1、在source端创建测试表空间
SQL> select tablespace_name, status from dba_tablespaces;
TABLESPACE_NAME STATUS
------------------------------ ---------
SYSTEM ONLINE
UNDOTBS1 ONLINE
SYSAUX ONLINE
TEMPTS1 ONLINE
USERS ONLINE
OUTLN ONLINE
6 rows selected.
SQL> select file_name from dba_data_files;
FILE_NAME
------------------------------------------------
/u01/app/oracle/oradata/normal/system01.dbf
/u01/app/oracle/oradata/normal/undotbs01.dbf
/u01/app/oracle/oradata/normal/sysaux01.dbf
/u01/app/oracle/oradata/normal/users01.dbf
/u01/app/oracle/oradata/normal/undotbs02.dbf
/u01/app/oracle/oradata/normal/system02.dbf
/u01/app/oracle/oradata/normal/outln01.dbf
7 rows selected.
2.2、创建表空间创建表空间 tset
SQL> create tablespace tset datafile '/u01/app/oracle/oradata/normal/test01.dbf' size 50M;
Tablespace created.
2.3、创建用户source_test,并指定表空间
--在source端
SQL> create user source_test identified by oracle default tablespace tset temporary tablespace TEMPTS1;
SQL> grant connect,resource to source_test;
Grant succeeded.
--在target端(暂时只先创建用户)
SQL> create user target_test identified by oracle temporary tablespace TEMPTS1;
SQL> grant connect,resource to target_test;
2.4、创建测试表
SQL> conn source_test/oracle
SQL> create table t1(id number, name varchar2(30));
SQL> insert into t1 values(1, 'AAAAA');
SQL> insert into t1 values(2, 'BBBBB');
SQL> commit;
Commit complete.
SQL> select * from t1;
ID NAME
---------- ------------------------------
1 AAAAA
2 BBBBB
3、在source端和target端创建 backup 的目录
[oracle@normal ~]$ mkdir -p /u01/backup
[oracle@normal ~]$ ls -l /u01
total 24
drwxr-xr-x 3 oracle oinstall 4096 Jul 28 12:31 app
drwxr-xr-x 2 oracle oinstall 4096 Sep 14 16:21 backup
SQL> show user
USER is "SYS"
SQL> create directory backup as '/u01/backup';
Directory created.
SQL> col owner format a5
SQL> col directory_name format a25
SQL> col DIRECTORY_PATH format a50
SQL> select * from dba_directories;
OWNER DIRECTORY_NAME DIRECTORY_PATH
----- ------------------------- --------------------------------------------------
SYS BACKUP /u01/backup
SYS OUTLN_DIR /home/oracle
SYS DATA_PUMP_DIR /u01/app/oracle/product/11.2.0/db_1/rdbms/log/
SYS ORACLE_OCM_CONFIG_DIR /u01/app/oracle/product/11.2.0/db_1/ccr/state
SQL> GRANT read, write ON DIRECTORY backup TO source_test;
Grant succeeded.
3.1、在target端
[oracle@test ~]$ mkdir -p /u01/backup
[oracle@test ~]$ ls -l /u01
total 24
drwxr-xr-x 3 oracle oinstall 4096 Aug 28 09:09 app
drwxr-xr-x 2 oracle oinstall 4096 Sep 14 16:40 backup
SQL> show user
USER is "SYS"
SQL> create directory backup as '/u01/backup';
Directory created.
SQL> col owner format a5
SQL> col directory_name format a25
SQL> col DIRECTORY_PATH format a50
SQL> select * from dba_directories;
OWNER DIRECTORY_NAME DIRECTORY_PATH
----- ------------------------- --------------------------------------------------
SYS BACKUP /u01/backup
SYS OUTLN_DIR /home/oracle
SYS DATA_PUMP_DIR /u01/app/oracle/product/11.2.0/db_1/rdbms/log/
SYS ORACLE_OCM_CONFIG_DIR /u01/app/oracle/product/11.2.0/db_1/ccr/state
SQL> GRANT read, write ON DIRECTORY backup TO target_test;
Grant succeeded.
4、检查表空间自包含(就是改表空间里的数据没有和其他表空间数据有关联,如果有关联会报错)
SQL> execute dbms_tts.transport_set_check('TSET', TRUE);
PL/SQL procedure successfully completed.
--查看自包含验证结果:
SQL> select * from transport_set_violations;
--没有记录说明没有错
5、将表空间TSET设置成read--only
SQL> alter tablespace TSET read only;
SQL> select tablespace_name, status from dba_tablespaces;
TABLESPACE_NAME STATUS
------------------------------ ---------
SYSTEM ONLINE
UNDOTBS1 ONLINE
SYSAUX ONLINE
TEMPTS1 ONLINE
USERS ONLINE
OUTLN ONLINE
TSET READ ONLY
7 rows selected.
6、生成:Transportable Tablespace Set
Transportable Tablespace Set有两部分:
1.expdp 导出的表空间的metadata
2.还有就是表空间对应的数据文件
6.1、expdp 导出的表空间的metadata
[oracle@normal normal]$ pwd
/u01/app/oracle/oradata/normal
[oracle@normal normal]$ ll
total 2294664
-rw-r----- 1 oracle oinstall 9781248 Sep 14 16:46 control01.ctl
drwx------ 2 oracle oinstall 16384 Aug 22 12:44 lost+found
-rw-r----- 1 oracle oinstall 20979712 Sep 14 15:52 outln01.dbf
-rw-r----- 1 oracle oinstall 52429312 Sep 14 16:45 redo01a.log
-rw-r----- 1 oracle oinstall 52429312 Sep 14 16:45 redo01b.log
-rw-r----- 1 oracle oinstall 52429312 Sep 14 15:52 redo02a.log
-rw-r----- 1 oracle oinstall 52429312 Sep 14 15:52 redo02b.log
-rw-r----- 1 oracle oinstall 52429312 Sep 14 15:52 redo03a.log
-rw-r----- 1 oracle oinstall 52429312 Sep 14 15:52 redo03b.log
-rw-r--r-- 1 oracle oinstall 22633 Aug 22 17:00 su.lst
-rw-r----- 1 oracle oinstall 340795392 Sep 14 16:40 sysaux01.dbf
-rw-r----- 1 oracle oinstall 340795392 Sep 14 16:43 system01.dbf
-rw-r----- 1 oracle oinstall 314580992 Sep 14 16:43 system02.dbf
-rw-r----- 1 oracle oinstall 20979712 Sep 14 15:53 temp01.dbf
-rw-r----- 1 oracle oinstall 52436992 Sep 14 15:53 temp02.dbf
-rw-r----- 1 oracle oinstall 52436992 Sep 14 16:31 test01.dbf
-rw-r----- 1 oracle oinstall 209723392 Sep 14 16:43 undotbs01.dbf
-rw-r----- 1 oracle oinstall 209723392 Sep 14 16:40 undotbs02.dbf
-rw-r----- 1 oracle oinstall 524296192 Sep 14 15:52 users01.dbf
[oracle@normal normal]$ expdp dumpfile=test01.dmp directory=backup transport_tablespaces=TSET transport_full_check=y logfile=TSET.log
Export: Release 11.2.0.3.0 - Production on Sun Sep 14 16:54:30 2014
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
Username: / as sysdba
Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Starting "SYS"."SYS_EXPORT_TRANSPORTABLE_01": AS SYSDBA dumpfile=test01.dmp directory=backup transport_tablespaces=TSET transport_full_check=y logfile=TSET.log
Processing object type TRANSPORTABLE_EXPORT/PLUGTS_BLK
Processing object type TRANSPORTABLE_EXPORT/TABLE
Processing object type TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK
Master table "SYS"."SYS_EXPORT_TRANSPORTABLE_01" successfully loaded/unloaded
******************************************************************************
Dump file set for SYS.SYS_EXPORT_TRANSPORTABLE_01 is:
/u01/backup/test01.dmp
******************************************************************************
Datafiles required for transportable tablespace TSET:
/u01/app/oracle/oradata/normal/test01.dbf
Job "SYS"."SYS_EXPORT_TRANSPORTABLE_01" successfully completed at 16:55:13
[oracle@normal normal]$ ls -l /u01/backup/
total 80
-rw-r----- 1 oracle oinstall 77824 Sep 14 16:55 test01.dmp
-rw-r--r-- 1 oracle oinstall 1160 Sep 14 16:55 TSET.log
7、将Transportable Tablespace set 传送到Target端
1)将表空间test 对应的数据文件copy到Target 对应的ORADATA目录下。
2)将expdp 导出的表空间metadta 数据copy 到Target 端的backup 目录下
--将表空间test 对应的数据文件copy到Target 对应的ORADATA目录下。
[oracle@normal normal]$ scp /u01/backup/test01.dmp 192.168.137.12:/u01/backup
oracle@192.168.137.12 s password:
test01.dmp 100% 76KB 76.0KB/s 00:00
--将expdp 导出的表空间metadta 数据copy 到Target 端的backup 目录下
[oracle@normal normal]$ scp test01.dbf 192.168.137.12:/u01/app/oracle/oradata/normal/test01.dbf
oracle@192.168.137.12 s password:
test01.dbf 100% 50MB 16.7MB/s 00:03
--在target端查看文件是否已经传输
[oracle@test ~]$ ll /u01/backup/
total 76
-rw-r----- 1 oracle oinstall 77824 Sep 14 17:03 test01.dmp
[oracle@test ~]$ ll $ORACLE_BASE/oradata/normal/test01.dbf
-rw-r----- 1 oracle oinstall 52436992 Sep 14 17:04 /u01/app/oracle/oradata/normal/test01.dbf
8、在Target 系统上Import 表空间的metadata(使用target_test用户,需要用到remap_schema)
[oracle@test ~]$ impdp directory=backup dumpfile=test01.dmp transport_datafiles=/u01/app/oracle/oradata/normal/test01.dbf remap_schema=source_test:target_test logfile=test.log
Import: Release 11.2.0.3.0 - Production on Sun Sep 14 17:09:25 2014
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
Username: / as sysdba
Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Master table "SYS"."SYS_IMPORT_TRANSPORTABLE_01" successfully loaded/unloaded
Starting "SYS"."SYS_IMPORT_TRANSPORTABLE_01": AS SYSDBA directory=backup dumpfile=test01.dmp transport_datafiles=/u01/app/oracle/oradata/normal/test01.dbf remap_schema=source_test:target_test logfile=test.log
Processing object type TRANSPORTABLE_EXPORT/PLUGTS_BLK
Processing object type TRANSPORTABLE_EXPORT/TABLE
Processing object type TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK
Job "SYS"."SYS_IMPORT_TRANSPORTABLE_01" successfully completed at 17:09:55
9、查看并修改表空间状态
SQL> select tablespace_name,status from dba_tablespaces;
TABLESPACE_NAME STATUS
------------------------------ ---------
SYSTEM ONLINE
UNDOTBS1 ONLINE
SYSAUX ONLINE
TEMPTS1 ONLINE
USERS ONLINE
OUTLN ONLINE
TSET READ ONLY
7 rows selected.
SQL> alter tablespace TSET read write;
Tablespace altered.
10、验证
SQL> conn target_test/oracle
Connected.
SQL> select * from t1;
ID NAME
---------- ------------------------------
1 AAAAA
2 BBBBB