传输表空间简介

1.简介

可以用oracle的传输表空间特点把数据库的一个子集加入到另外一个数据库中,实质上是在数据库间移动表空间。被移动的表空间可以是字典管理的也可以是本地管理的。从

oracle9i开始,被传输的表空间不在要求和目标数据库的数据块大小一致。

移动相同的数据,传输表空间比expdb/impdb以及unload/load要快得多。这是因为传输表空间把包含数据的数据文件只是简单的拷贝到目标位置,而导入工具把表空间对象的元数

据传输到新数据库中。

传输表空间在一些
场景中适用,包括:
*在数据仓库表中导出/导入分区表
*把结构化的数据发布到光盘(CDs)
*数据库间拷贝多个只读表空间
*归档历史数据
*执行表空间基于时间点的恢复


2.跨平台表空间传输
从oracle10g开始,可以跨平台表空间传输,可以用于:
*把数据库从一个平台迁移到另一个平台
*为内容提供上提供更简易、更有效的方法来发布结构化数据,部署到在不同平台上运行oracle数据库的服务器上。
*简单的从数据仓库数据部署到运行于更小平台的数据集市
*使安装于不同操作系统或平台上的ORACLE数据库共享数据。如果所有的平台可以访问相同的存储系统,并且有相同的endianness,那么他们之间是可以跨平台传输表空间的。

可以查看V$TRANSAPORTABLE_FLATFORM视图来查看支持跨平台传输表空间,例如:
SQL> desc v$transportable_platform
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 PLATFORM_ID                                        NUMBER
 PLATFORM_NAME                                      VARCHAR2(101)
 ENDIAN_FORMAT                                      VARCHAR2(14)

SQL> col PLATFORM_NAME for a40
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

PLATFORM_ID PLATFORM_NAME                            ENDIAN_FORMAT
----------- ---------------------------------------- --------------
          9 IBM zSeries Based Linux                  Big
         13 Linux x86 64-bit                         Little
         16 Apple Mac OS                             Big
         12 Microsoft Windows x86 64-bit             Little
         17 Solaris Operating System (x86)           Little
         18 IBM Power Based Linux                    Big
         19 HP IA Open VMS                           Little
         20 Solaris Operating System (x86-64)        Little
         21 Apple Mac OS (x86-64)                    Little

20 rows selected.

如果源平台和目标平台的endianness不同,需要一个补充的步骤来转换源表空间或目标表空间到一个目标格式。如果他们有相同的endianness,不需要转换,和相同的平台一样,

可以进行表空间传输。
一个表空间传输到不同的平台之前,数据文件头必须标示它所属平台。在10.0.0及以上版本的oracle数据库中,你可以设置数据文件为读写模式来完成标示。

3.可传输表空间的限制
传输表空间受到如下限制:
*源数据库和目标数据库有相同的字符集和national字符集
*如果目标数据库有相同名称的表空间,你不能传输。你可以更改源数据库的表空间名称或者目标数据库的表空间名称
*有底层对象的对象(物化视图)或者包含对象的对象(分区表)不能被传输,除非底层对象或被包含的对象也在传输的表空间集中


大多数实体在传输表空间后都是正常的,下面几种情况例外:

*高级队列
传输表空间不支持兼容8.0的高级队列
*系统表空间对象
不能传输SYSTEM表空间或者SYS用户拥有的对象。
*不透明的类型
*浮点数
INARY_FLOAT 和 BINARY_DOUBLE只能用数据泵传输


4.传输表空间的兼容性注意事项

当你创建传输表空间集的时候,oracle计算在目标数据库运行的最低兼容性级别。从oracle10g开始,表空间可以传输给相同或更高兼容性级别的数据库,无论目标数据库在相同还

是不同的平台上。如果传输表空间集的兼容性级别高于目标数据库的兼容性级别,数据库将报错。

下表显示在不同的场景中源数据库和目标数据库的兼容性级别。源数据库和目标数据库没必要有相同的兼容性级别。
Transport Scenario                                                 Minimum Compatibility Setting
                                                                        Source Database Target Database
Databases on the same platform                                         8.0 8.0
Tablespace with different database block size than the target database 9.0 9.0
Databases on different platforms                                 10.0 10.0

5.数据库间传输表空间,过程和实例
传输和拷贝表空间集,需要执行以下几步
A.如果是跨平台传输,查看V$TRANSPORTABLE_PLATFORM视图,看endian是否一致。如果不一致,需要在源数据库或者目标数据库执行一次转换。否则,不需要转换。
B.选择一个自包含的表空间集。
C.生成传输表空间集,一个传输表空间集由被传输的表空间的数据文件和包含表空间集的结构化信息的导出文件组成。如果源数据库和目标数据库的endian不一样,需要在源数据

库端或者目标数据库端做一次转换,让两方一致。
D.传输表空间集,拷贝数据文件和导出文件到目标位置,你可以用各种文件复制工具(比如,操作系统复制命令,ftp,dbms_file_copy包,发布到CDs).如果需要转换并且在源数

据库端没有转换,需要在目标数据库端做一次转换。
E.加入表空间,用数据泵工具把传输表空间加入目标数据库。

下面是一个例子:

第一步:测试平台是否支持并且endian一致

这一步只有在源数据库和目标数据库不一样的情况下才需要,如果sale1和sale2表空间被传输到一个不同的平台上,你可以按下面的步骤测试:
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
------------------------- --------------
Solaris[tm] OE (32-bit)   Big

目标数据库平台查询结果:

PLATFORM_NAME             ENDIAN_FORMAT
------------------------- --------------
Microsoft Windows NT      Little

可见,需要进行一次转换。

第二步:选择自包含的表空间集:
在选择的传输表空间和没有选择表空间之间可能会有些依赖关系,你只能选择自包含的表空间,自包含意味着没有引用从选择的表空间只想没有选择表空间,一些自包含紊乱的例

子包括:
A.位于选择表空间中的索引对应的表不在选择的表空间内
B.分区表只有部分分区在选择的表空间内
C.一致性约束指向为选择的表空间的内的表
D.选择表空间内的表包含LOB列,这个LOB列执行未选择表空间内的LOBS

为了测试一个表空间是否自包含的,你可以使用DBMS_TTS包的TRANSPORT_SET_CHECK存储过程,你必须拥有EXECUTE_CATALOG_ROLE。
使用DBMS_TTS包时,你可以指定表空间集中的需要检查的表空间,你可以选择性的指定必须检查的表空间,对于严格或者全密封的表空间,你必须另外指定TTS_FULL_CHECK 参数为

TRUE
下面的语句用于检查表空间sale1和sale2是否自包含的,
EXECUTE DBMS_TTS.TRANSPORT_SET_CHECK('sales_1,sales_2', TRUE);

执行DBMS_TTS后,你可以查看TRANSPORT_SET+VIOLATIONS视图查看表空间是否自包含的,如果是自包含的,查询结果是空的。下表显示两个紊乱:
QL> 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

These violations must be resolved before sales_1 and sales_2 are transportable. As noted in the next step, one choice for bypassing the integrity constraint

violation is to not export the integrity constraints.


第三步、产生传输表空间集
为了执行传输表空间导出操作,你必须拥有EXP_FULL_DATABASE角色。
确定你选择的表空间是自包含的以后,你可以执行下面的动作来产生传输表空间集

A.把所有表空间设置为只读.

SQL> ALTER TABLESPACE sales_1 READ ONLY;

Tablespace altered.

SQL> ALTER TABLESPACE sales_2 READ ONLY;

Tablespace altered.


B.在数据库主机上调用数据泵,指定传输表空间集中的表空间

SQL> HOST

$ EXPDP system/password DUMPFILE=expdat.dmp DIRECTORY=dpump_dir
        TRANSPORT_TABLESPACES = sales_1,sales_2

你必须执行TRANSPORT_TABLESPACES,这个参数决定导出操作的模式,这个例子中

*DUMPFILE 参数指定结构化信息导出文件的名称
*DIRECTORY 参数指定指向操作系统导出文件目录的目录对象,执行之前,必须创建目录对象,必须把目录对象的write权限授予public角色。
*触发器和索引默认情况下被导出

如果你希望执行严格数据一致性检查的传输,用TRANSPORT_SET_CHECK。例如:
EXPDP system/password DUMPFILE=expdat.dmp DIRECTORY = dpump_dir
      TRANSPORT_TABLESPACES=sales_1,sales_2 TRANSPORT_FULL_CHECK=Y

C.转换
如果表空间需要转换

$ RMAN TARGET /

Recovery Manager: Release 10.1.0.0.0

Copyright (c) 1995, 2003, Oracle Corporation.  All rights reserved.

connected to target database: salesdb (DBID=3295731590)

RMAN> CONVERT TABLESPACE sales_1,sales_2
2> TO PLATFORM 'Microsoft Windows NT'
3> FORMAT '/temp/%U';

Starting backup at 08-APR-03
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=11 devtype=DISK
channel ORA_DISK_1: starting datafile conversion
input datafile fno=00005 name=/u01/oracle/oradata/salesdb/sales_101.dbf
converted datafile=/temp/data_D-10_I-3295731590_TS-ADMIN_TBS_FNO-5_05ek24v5
channel ORA_DISK_1: datafile conversion complete, elapsed time: 00:00:15
channel ORA_DISK_1: starting datafile conversion
input datafile fno=00004 name=/u01/oracle/oradata/salesdb/sales_101.dbf
converted datafile=/temp/data_D-10_I-3295731590_TS-EXAMPLE_FNO-4_06ek24vl
channel ORA_DISK_1: datafile conversion complete, elapsed time: 00:00:45
Finished backup at 08-APR-03

RMAN> exit
Recovery Manager complete.


第四步、传输表空间集
拷贝数据文件和导出文件到目标数据库,可以用操作系统工具,ftp,DBMS_FILE_TRANSPORT包等。
如果表空间需要转换,你必须做一次转换。
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> DBFILE_NAME_CONVERT=
8> "/hq/finance/work/tru/", "/hq/finance/dbs/tru"
9> PARALLELISM=5;


第五步、加入表空间集
用数据泵加入表空间和结构化信息。
IMPDP system/password DUMPFILE=expdat.dmp DIRECTORY=dpump_dir
   TRANSPORT_DATAFILES=
   /salesdb/sales_101.dbf,
   /salesdb/sales_201.dbf
   REMAP_SCHEMA=(dcranney:smith) REMAP_SCHEMA=(jfee:williams)

所有这些操作以后,传输过来的表空间是只读的,把这些表空间设置为READ/WRITE
ALTER TABLESPACE sales_1 READ WRITE;
ALTER TABLESPACE sales_2 READ WRITE;

 

 

 

你可能感兴趣的:(传输表空间简介)