Transportable Tablespaces

1. 概念
     Transportable tablespaces 可以把一个表空间集从一个数据库拷贝到另一个数据库。这些表空间可以是本地管理的(Locally managed)或者是字典管理的(dictionary managed)。而且从9i之后被传输的表空间的数据块大小不在需要和目标数据库的标准数据块大小一样了。
 
     利用该方法移动数据要比export/import或unload/load还要块得多。这是因为包含真正数据的数据文件被拷贝到目标数据库,然后用data pump来传输表空间对象的元数据(metadata)到新的数据库。

     Transportable tablespace 在以下情形很适合: 
  • Exporting and importing partitions in data warehousing tables

  • Publishing structured data on CDs

  • Copying multiple read-only versions of a tablespace on multiple databases

  • Archiving historical data

  • Performing tablespace point-in-time-recovery (TSPITR)

    传输一个表空间有两种方法:
    1). Manually:用SQL*PLUS, RMAN, Data Pump
    2). OEM: 允许Transport Tablespaces 向导

2. 关于交叉平台的transporting tablespaces
    从11g开始允许交叉平台的表空间传输,它可以把一个数据库从一个平台被移植到另一个平台。由于不同的操作系统平台数据格式是不一样的,因此,在传输时必须进行转换。
    各平台的格式可以用SQL语句查询:
    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
 
3. 使用transportable tablesapces特性的限制
     1). 源数据库必须和目标数据库有相同的字符集和国家字符集。
     2). 如果目标数据库有同名的表空间,则不能传输。不过可以先重命名再传输。
     3). 如果一个对象或表空间不是自包含的(self contained),那也不适用
     4). 加密表空间的限制
          a). 在传输加密的表空间之前,必须先把Oracle wallet手工的拷贝到目标数据库,最好再更改密码。如果是用Hardware Security Module(HSM)存储主密钥就不需要这么做了。
          b). 如果目标数据库已经有了Oracle Wallet,那么必须使用Oracle Data Pump把表空间的schema objects导出,然后在导入到目标数据库。
          c). 不能传输加密的表空间于交叉平台。
       5). 如果表空间没加密,但表空间里表的列被加密了,也必须通过Data Pump来从源数据库导出表空间schema objects,再导入到目标数据库。
       6). 从10.2开始就可以传输包含XML类型数据的表空间。从11g开始必须使用Data Pump来导出和导入这种表空间。
             这个SQL语句查询包含XML类型数据的表空间:
       SQL> 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
            对于传输包含XML类型数据的表空间显示见附件。

4. 实例:
     传输表空间USERS:
     USERS: /data/oradata/orcl/users01.dbf
     第一步:查询平台是否支持和决定字节序(Endianness)
     如果是交叉平台的传输必须先查询是否都是支持的平台,和各个平台的字节序。因为如果字节序不同在传输时需要进行转换。
     查询语句:
     SQL> 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
第二步:查询自包含的表空间集
在表空间集里有很多逻辑和物理上对象间的依赖关系,只能传输一个自包含的表空间。自包含的意思是在表空间内没有引用表空间外的对象。
利用系统包DBMS_TTS.TRANSPORT_SET_CHECK来检查自包含(必须要有EXECUTE_CATALOG_ROLE角色才能执行这个过程):
SQL> EXECUTE DBMS_TTS.TRANSPORT_SET_CHECK('USERS');
SQL> EXECUTE DBMS_TTS.TRANSPORT_SET_CHECK('USERS',TRUE);
这里TRUE是TTS_FULL_CHECK的值,也就是说执行strict or full containment检查,它除了要由里向外检查引用关系外,还由外向里检查引用关系。
一个'full containment check' 保证里外都没有依赖关系。
然后如果有依赖关系这以下查询将显示结果:
SQL> SELECT * FROM TRANSPORT_SET_VIOLATIONS;

第三步:产生Transportable tablespaces集
任何人都有权执行这步,但必须要有EXP_FULL_DATABASE角色的权限才能执行一个transportable tablespace的导出工作。
必须先把表空间设为只读READ-ONLY状态,或备份状态
1). SQL> ALTER TABLESPACE USERS READ ONLY;
用Data Pump导出数据(必须先要有个DIRECTORY对象并赋予读写权限)
2). SQL> create directory expdump as '/bakup/export';
Directory created.
3). SQL> grant read, write on directory expdump to public;
Grant succeeded.
4). $ EXPDP system/password DUMPFILE=expdat.dmp DIRECTORY=expdump TRANSPORT_TABLESPACES=USERS
Export: Release 11.1.0.6.0 - Production on Tuesday, 14 July, 2009 10:48:47

Copyright (c) 2003, 2007, Oracle. All rights reserved.

Connected to: Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Starting "SYSTEM"."SYS_EXPORT_TRANSPORTABLE_01": system/******** dumpfile=expdat.dmp directory=expdump transport_tablespaces=users
Processing object type TRANSPORTABLE_EXPORT/PLUGTS_BLK
Processing object type TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK
Master table "SYSTEM"."SYS_EXPORT_TRANSPORTABLE_01" successfully loaded/unloaded
******************************************************************************
Dump file set for SYSTEM.SYS_EXPORT_TRANSPORTABLE_01 is:
/bakup/export/expdat.dmp
******************************************************************************
Datafiles required for transportable tablespace USERS:
/data/oradata/orcl/users01.dbf
Job "SYSTEM"."SYS_EXPORT_TRANSPORTABLE_01" successfully completed at 10:50:49
如果是交叉平台的传输,此时必须进行字节序转换:

5). $ RMAN TARGET /
RMAN> CONVERT TABLESPACE USERS TO PLATFORM. 'Microsoft Windows NT' FORMAT '/temp/%U';
或者是
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;
RMAN> EXIT

此时已经转换好了字节序。
            6). 把数据文件和导出的dump文件传输到目标数据库
                 可以用FTP, DBMS_FILE_TRANSFER, RMAN等工具传输
            7). 导入表空间
             注: 如果是非标准的数据块表空间传输,必须在目标数据库里设置DB_nK_CACHE_SIZE参数。
            目标数据库也必须先创建DIRECTORY 对象,并把导出的数据文件放在该目录下。
            $ impdp system/pwd DUMPFILE=expdat.dmp DIRECTOYR=expdump TRANSPORT_DATAFILES=/data/oradata/orcl/users01.dbf REMAP_SCHEMA=(user1:user2) REMAP_SCHEMA=(user3:user4)
               该导入语句中REMAP_SCHEMA允许把原先user1的对象映射为user2对象,user3->user4。否则目标数据库必须存在相同的用户。
            也可以用参数文件,如:
           IMPDP system/password PARFILE='par.f'
           par.f:
           DIRECTORY=dpump_dir
           DUMPFILE=expdat.dmp
           TRANSPORT_DATAFILES="'/db/sales_jan','/db/sales_feb'"
           REMAP_SCHEMA=dcranney:smith
           REMAP_SCHEMA=jfee:williams

          8). 把表空间恢复读写状态
          SQL> ALTER TABLESPACE USERS READ WRITE;

这样就完成了Transport tablespaces.

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9466564/viewspace-609107/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/9466564/viewspace-609107/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值