• 使用 ExpDP 和 ImpDP 来转移数据


    今天遇到一个需求,把一个Schema下的对象(Table, Sequence, Package, etc)分别转移到其他两个Schema下。如果用普通的Exp/Imp,需要在tables参数里面写很多东西。并且 wait4friend 还不确定能否对sequence等对象进行排除。所以决定使用10g之后提供的数据泵来处理。

    背景是这样的,原始用户是Test,分别导入

    1. TestDP_0,全量导入

    2. TestDP_1,部分对象导入

    准备工作

    首先建立各种对象,其中比较重要的是Oracle目录对象。数据泵只能把数据存放在目录对象指定的位置。

    PS: DB Link不是必须的,这里是为了测试本机数据不落地直接导入导出。

    -----------------------------------------------------------------------------------
    -------- 建立数据泵需要使用的目录对象
    drop directory pump;
    create directory pump as '/home/oracle/pump';
    
    select * from dba_directories;
    
    -----------------------------------------------------------------------------------
    -------- 建立连接到自己的db link
    -- as sysdba
    drop public database link link_self;
    create public database link link_self connect to system identified by *** using 'xxxx'; 
    
    -----------------------------------------------------------------------------------
    --------- 建立需要导入的用户
    -- dest 0 and src 2
    drop user testdp_0 cascade;
    create user testdp_0 identified by test default tablespace hfzc;
    grant resource, connect to testdp_0;
    
    -- dest 1
    drop user testdp_1 cascade;
    create user testdp_1 identified by test default tablespace hfzc;
    grant resource, connect to testdp_1;
    
    -- dest 2
    drop user testdp_2 cascade;
    create user testdp_2 identified by test default tablespace hfzc;
    grant resource, connect to testdp_2;

    Step 1

    全量导出用户下的所有对象,参数文件如下

    userid=system/***
    directory=pump                       -- Oracle目录对象 
    parallel=2
    schemas=test
    dumpfile=test201.dmp
    logfile=test201.log

    Step 2

    把所有对象和数据导入到新建立的TestDP_0用户中

    userid=system/***
    directory=pump
    parallel=2
    schemas=test
    remap_schema=test:testdp_0     -- 重新映射用户
    dumpfile=test201.dmp
    logfile=testdp_0_imp_full.log
    transform=OID:N                      -- 避免在同一个库导入object时发生OID重复的错误

    Step 3

    把指定的对象导入到TestDP_1用户下,使用了include参数

    userid=system/***
    directory=pump
    parallel=2
    schemas=test
    remap_schema=test:testdp_1
    dumpfile=test201.dmp
    logfile=testdp_1_imp_part.log
    transform=OID:N
    include=table:"in ('EP_BILL','EP_CUSTOMER')",sequence:"in ('BILL_ID') ",package:"in ('EP_PKG')"  -- 只导入指定的对象

    Step 4

    通过exclude参数排除掉一部分对象,把其他的全部导入TestDP_2用户下,并且通过DB Link操作。注意这里没有使用刚才导出的dump文件。

    userid=system/***
    directory=pump
    parallel=2
    schemas=test
    remap_schema=test:testdp_2
    network_link=link_self              -- 不使用DUMP文件,而直接使用数据库链接
    logfile=testdp_2_imp_dblink.log
    transform=OID:N
    exclude=table:"in ('EP_BILL','EP_CUSTOMER')",sequence:"in ('BILL_ID') ",package:"in ('EP_PKG')"  --  排除对象

    执行ExpDP,ImpDP

    因为把参数都写在了参数文件中,所以调用过程非常简单,仅仅是使用不同的参数文件名称填充parfile

    [oracle@TESTDB pump]$ expdp parfile=test.par

    作者:wait4friend
    Weibo:@wait4friend
    Twitter:@wait4friend
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    Spring Bean的生命周期
    使用docker安装虚拟机并打开ssh连接
    查看/设置JVM使用的垃圾收集器
    使用Apollo动态修改线上数据源
    java8之lambda表达式
    Java8之Stream
    @Bean 的用法
    Java中的Filter过滤器
    详解tomcat的连接数与线程池
    什么是ClassLoader
  • 原文地址:https://www.cnblogs.com/wait4friend/p/2704403.html
Copyright © 2020-2023  润新知