Transporting Tablespace Between Database

  • 【测试目的】

    利用Oracle TTS(transport tablespace)特性实现表空间合并

  • 【主要步骤】

    1. 确定源平台/目的平台信息以及以及字节序信息

    2. 确定待传输的表空间是否独立 (self-contained)

    3. 生成transportable tablespace set

      transportable tablespace set包含待传输表空间所有数据文件以及待传输表空间结构信息(metadata)导出文件;

      如果源平台/目的平台的字节序信息不同, 就必须将tablespace set的字节序信息转换为目的平台;

      既可以在源平台上转换, 也可以在目的平台转换;

    4. 传输(scp/rsync) tablespace set

    5. 导入tablespace set

  • 【测试一】

    从DB01将user01用户相关的表空间传输到DB02

    实例信息:

    Username ORACLE_SID DB_IP DR_IP
    user01 DB01 1.1.1.1 1.1.1.2
    user02 DB02 2.2.2.2 2.2.2.3

    数据文件:

      SQL> select file_name,tablespace_name from dba_data_files where tablespace_name in ('user01_DAT','user01_IDX');
    
      FILE_NAME                                          TABLESPACE_NAME
    -------------------------------------------------- ------------------------------
    /data1/oradata/DB01/r221dat009.dbf user01_DAT
    /data1/oradata/DB01/r221dat010.dbf user01_DAT ......
    /data1/oradata/DB01/r221idx007.dbf user01_IDX
    /data1/oradata/DB01/r221idx008.dbf user01_IDX 30 rows selected.

    测试示例:

    • Step 1: 确定平台信息以及字节信息

    source platform:

      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
    -------------------------- --------------
    Linux x86 64-bit Little

    target platform:

      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
    -------------------------- --------------
    Linux x86 64-bit Little

    从查询结果看到: 平台和字节序信息相同, 因此不需要进行convert操作

    • Step 2: 确认Self-Contained Set of Tablespaces

    执行存储过程:

    DBMS_TTS.TRANSPORT_SET_CHECK检查表空间是否独立

      SQL>EXECUTE DBMS_TTS.TRANSPORT_SET_CHECK('user01_DAT,user01_IDX',TRUE);
    
      PL/SQL procedure successfully completed.
    
      SQL> select * from TRANSPORT_SET_VIOLATIONS;
    
      no rows selected
    • Step 3: 生成Transport Tablespace Set

      1. 将要传输的相关表空间read-only

         SQL> alter tablespace user01_DAT read only;
        SQL> alter tablespace user01_IDX read only;
      2. 导出metadata信息

        2.1 创建导出目录

         SQL> create directory dump_dir as '/u/dump/';
        SQL> grant read,write on directory dump_dir to PUBLIC;

        2.2 调用expdp工具

         expdp dumpfile=expdat.dmp directory=dump_dir transport_tablespaces = user01_DAT,user01_IDX transport_full_check=y
        
         Export: Release 11.2.0.2.0 - Production on Thu Sep 26 11:45:33 2013
        
         Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.
        
         Username:******
        
         Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production
        With the Partitioning, OLAP, Data Mining and Real Application Testing options
        Starting "SYSTEM"."SYS_EXPORT_TRANSPORTABLE_01": system/******** dumpfile=expdat.dmp directory=dump_dir transport_tablespaces=user01_DAT,user01_IDX transport_full_check=y
        Processing object type TRANSPORTABLE_EXPORT/PLUGTS_BLK
        ORA-39126: Worker unexpected fatal error in KUPW$WORKER.UNLOAD_METADATA [PLUGTS_BLK]
        ORA-00904: "Q"."TABOBJ_NUM": invalid identifier ORA-06512: at "SYS.DBMS_SYS_ERROR", line 95
        ORA-06512: at "SYS.KUPW$WORKER", line 8358 ----- PL/SQL Call Stack -----
        object line object
        handle number name
        0x5ba4f3e20 19208 package body SYS.KUPW$WORKER
        0x5ba4f3e20 8385 package body SYS.KUPW$WORKER
        0x5ba4f3e20 2935 package body SYS.KUPW$WORKER
        0x5ba4f3e20 9054 package body SYS.KUPW$WORKER
        0x5ba4f3e20 1688 package body SYS.KUPW$WORKER
        0x5ba4f7e60 2 anonymous block
        Job "SYSTEM"."SYS_EXPORT_TRANSPORTABLE_01" stopped due to fatal error at 11:13:56

        在这里调用expdp工具时, 遇到错误:

        encounter some error: ORA-39126: Worker unexpected fatal error in KUPW$WORKER.UNLOAD_METADATA [PLUGTS_BLK]

        for more information: http://martincarstenbach.wordpress.com/2011/05/10/slight-11-2-0-2-caveat-with-tts-and-missing-xmldb/

        解决办法:

        A. 使用exp/imp工具

         	exp file=/u/dump/expdat.dmp log=/u/dump/expdat.log transport_tablespace=y tablespaces=user01_DAT,user01_IDX

        B. 编译后,使用expdp/impdp工具

         	conn / as sysdba
        @?/rdbms/admin/catbundle.sql psu apply
        @?/rdbms/admin/catqm.sql xdb sysaux temp yes
        @?/rdbms/admin/utlrp.sql expdp dumpfile=expdat.dmp directory=dump_dir transport_tablespaces = user01_DAT,user01_IDX transport_full_check=y
      3. 如果Step 1中的平台信息, 以及字节序信息不同, 那么就需要对表空间进行convert; 否则直接跳过, 进行Step 4操作

        这里假设target platform是Microsoft Windows NT平台, 需要在source platform上convert数据文件到临时目录:

         RMAN TARGET / NOCATALOG
        RMAN> convert tablespace user01_DAT,user01_IDX to platform 'Microsoft Windows NT' format '/temp/%U';
    • Step 4: 传输Tablespace Set

        rsync -a --progress  oracle@1.1.1.1:/data1/oradata/DB01/r221*dbf /data1/oradata/DB01/
      rsync -a --progress oracle@1.1.1.1:/u/dump/expdat.* /u/

      如果是将表空间传输到不同平台不同字节序的目的端, 并且Step 3中没有做convert操作, 然而不管数据文件是否被convert过, 都必须移动到特定的目的端位置;

      使用RMAN命令convert传输过来的数据文件为目的端字节序信息, 并且将结果存储在/data1/oradata/DB01/

      这里假设数据文件存放在目的端目录:/data1/dbbak/test/,target platform是Microsoft Windows NT平台:

        RMAN> convert datafile
      2> '/data1/dbbak/test/r231dat005.dbf'
      ......
      13> '/data1/dbbak/test/r231idx004.dbf'
      14> to platform="Microsoft Windows NT"
      15> from platform="Linux x86 64-bit"
      16> db_file_name_convert=
      17> "/data1/dbbak/test/","/data1/oradata/DB01/"
      18> parallelism=5;

      备注:

      1. 省略号出需要填写全部的文件信息;
      2. 在target platform上RMAN是通过文件名来辨识数据文件的, 而不是表空间名称. 因为目的端是无法知道表空间名称的, 直到metadata导入到实例;
      3. 参数: to platform和from platform信息是可选的, RMAN通过存在的数据文件确定source platform信息, 以及运行convert主机上默认的target platform信息;
    • Step 5: Import the Tablespace Set

      1. 在目标平台上, 导入metadata信息之前用户必须存在

         SQL> create user user01 identified by user01;
        SQL> grant connect to user01;

        或者

        可以用下面sql迁移source上的用户和权限

        1.1 创建用户

         SQL> select 'create user '||a.name||' identified by values "'||a.password||'";' from user$ a,dba_users b where a.user#=b.user_id and b.account_status='OPEN' and a.name not in ('SYS','SYSTEM','PERFSTAT');

        1.2 设置用户默认的表空间

         SQL> select 'alter user '||a.name||' default tablespace '||b.default_tablespace||';' from user$ a,dba_users b where a.user#=b.user_id and b.account_status='OPEN' and a.name not in ('SYS','SYSTEM','PERFSTAT');

        1.3 初始化用户权限

         SQL> select 'grant create session to '||a.name||';' from user$ a,dba_users b where a.user#=b.user_id and b.account_status='OPEN' and a.name not in ('SYS','SYSTEM','PERFSTAT');
        SQL> select 'grant '||c.PRIVILEGE||' to '||d.name||';' from (select distinct a.name from user$ a,dba_users b,dba_sys_privs c where a.user#=b.user_id and a.name=c.grantee and b.account_status='OPEN' and a.name not in ('SYS','SYSTEM','PERFSTAT')) d,dba_sys_privs c where d.name=c.grantee;
      2. Import metadata信息

        2.1 使用imp/exp工具

         imp parfile=/u/par.f

        --参数:parfile可以用来指定impdp参数

        /u/par.f内容:

         file=/u/expdat.dmp
        log=/u/impdat.log
        transport_tablespace=y
        tablespace=user01_DAT,user01_IDX
        datafiles=
        /data1/oradata/DB01/r221dat015.dbf,
        ......
        /data1/oradata/DB01/r221idx002.dbf,
        /data1/oradata/DB01/r221idx001.dbf

        备注:

        1. 省略号处需要列举所有数据文件信息;

        2.2 使用expdp/impdp工具

         impdp parfile=/u/par.f

        --参数: parfile可以用来指定impdp参数

        /u/par.f内容:

         dumpfile=expdat.dmp
        directory=dump_dir
        transport_datafiles=
        /data1/oradata/DB02/r231dat005.dbf,
        ......
        /data1/oradata/DB02/r231idx003.dbf,
        /data1/oradata/DB02/r231idx004.dbf
        logfile=tts_impdp.log

        备注:

        1. 省略号处需要列举所有数据文件信息;

--END--

[Oracle] Transporting Tablespace的更多相关文章

  1. 转 Oracle Transportable TableSpace(TTS) 传输表空间 说明

    ############1   迁移数据库的集中方法 三.相关技术 迁移方式 优势 不足1 Export and import • 对数据库版本,以及系统平台没有要求 • 不支持并发,速度慢• 停机时 ...

  2. Oracle错误——tablespace 'XXXX' does not exist

    错误 在使用IMP命令导入Oracle数据的时候,因为导出数据的数据库表空间和导入数据的数据库表空间不同,导致导入数据失败,出现:tablespace 'XXXX' does not exist 在网 ...

  3. oracle create tablespace

    ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED; sqlplus shybt/shybt@127.0.0.1:1521/orcl Cr ...

  4. Oracle create tablespace 、create user and so on

    1.创建临时表空间 CREATE TEMPORARY TABLESPACE test_tempTEMPFILE 'C:\oracle\product\10.1.0\oradata\orcl\test_ ...

  5. Oracle create tablespace 创建表空间语法详解

    CREATE [UNDO]  TABLESPACE tablespace_name          [DATAFILE datefile_spec1 [,datefile_spec2] ...... ...

  6. 【Oracle 】tablespace 表空间创建和管理

    1.表空间的概述 1. 表空间是数据库的逻辑组成部分. 2. 从物理上讲,数据库数据存放在数据文件中: 3. 从逻辑上讲,数据库是存放在表空间中,表空间由一个或者多个数据文件组成. 2.oracle的 ...

  7. Oracle transport tablespace

    本来没想过发布这个文章,只是周边有一朋友工作中遇到合并数据库的情况,他是通过expdp提取出五个库对象,然后impdp到新库里面.我觉得这种方法特别耗时,尤其在数据量比较大的时候.这种时候我觉得采用表 ...

  8. Oracle UNDO Tablespace size & Table Size

    Table Space Query select SEGMENT_NAME,bytes/1024/1024,a.* from dba_segments a UNDO Table Space Size ...

  9. Oracle - PL/SQL Commands

    第一章:日志管理 1.forcing log switches sql> alter system switch logfile; 2.forcing checkpoints sql> a ...

随机推荐

  1. PHP.35-TP框架商城应用实例-后台11-商品分类-删除分类(2种方法)、添加、修改

    删除分类 删除一个分类的同时,其所有子分类都删除 在控制器CategoryCtroller.class.php中添加删除函数(delete) 在分类模型中添加钩子函数_before_delete()[ ...

  2. Servlet过滤器---简介

    过滤器的基本概念 Servlet过滤器从字面上的字意理解为经过一层次的过滤处理才达到使用的要求,而其实Servlet过滤器就是服务器与客户端请求与响应的中间层组件,在实际项目开发中Servlet过滤器 ...

  3. 调试bug 技巧

    两天,一个小bug 我调试了两天,最终调试成功了.还是在别人的帮助下. 问题是刷新相关的.当用户登录了,其他的页面都要刷新.也就是加上一些参数. 但是有一个fragment一直加不上,其他挨着的两个都 ...

  4. laravel5.5配置信息

    目录 1 环境配置 1.1 检索环境配置 1.2 确定当前环境 2 访问配置值 3 配置缓存 4 维护模式 配置文件在config目录下,为了便于不同人员的开发,我们可以使用不同的.env文件来配置各 ...

  5. Spark Streaming实例

    Spark Streaming实例分析 2015-02-02 21:00 4343人阅读 评论(0) 收藏 举报  分类: spark(11)  转载地址:http://www.aboutyun.co ...

  6. Jenkins拾遗--第一篇(安装Jenkins)

    起因 近期由于工作需要做起了起了jenkins的维护.不做不知道,一搞发现里边全是小坑.两个月弄了一身泥.曾经小瞧了它,但是发现其实要弄好它不是那么容易的.有句知名的话"没有总结就没有提高. ...

  7. 剑指Offer - 九度1370 - 数组中出现次数超过一半的数字

    剑指Offer - 九度1370 - 数组中出现次数超过一半的数字2013-11-23 03:55 题目描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组 ...

  8. 玩转Node.js(一)

    玩转Node.js(一) 在说Node.js之前,我们先来说说js,如果你也曾开发过前端,那么你一定接触到了这个叫JavaScript有趣的东西,而对于JavaScript,你只会基本的操作——为we ...

  9. Python之日志处理 logging模块

    Python之日志处理(logging模块)   本节内容 日志相关概念 logging模块简介 使用logging提供的模块级别的函数记录日志 logging模块日志流处理流程 使用logging四 ...

  10. zoj3161 Damn Couples

    不想打题面了,题面戳这里 这道题目的模型转换地有点猛.首先我们肯定需要让老板把那些不相邻的人的卡牌放在前面,这样他们就作废了.然后剩下的卡牌就都是相邻人之间的了.我们就可以把这个序列分成若干个联通块, ...