• Oracle expdp/impdp 使用示例


     

     

    在之前的blog

           Oracle 10g Data Pump Expdp/Impdp 详解

           http://blog.csdn.net/tianlesoftware/archive/2009/10/15/4674224.aspx

     

           exp/imp expdp/impdp 对比 及使用中的一些优化事项

           http://blog.csdn.net/tianlesoftware/archive/2010/12/23/6093973.aspx

     

           中对数据泵这块的理论知识有一些说明,但是没有实际操作的例子。 所以在这里就对expdp/impdp 的使用做一些测试。

     

     

    1. 创建目录

           使用数据泵之前,需要创建一个存放文件的目录。 这个目录要写入Oracle的数据字典中才能识别。

     

    1)先查看一下已经存在的目录:

    SQL> col owner format a5

    SQL> col directory_name format a25

    SQL> select * from dba_directories;

     

    OWNER DIRECTORY_NAME            DIRECTORY_PATH

    ----- ------------------------- ------------------------------------------------

    SYS   BACKUP                    /u01/backup

     

    2)把我们把backup 这个目录删除掉,在重新创建一下

    SQL> drop directory backup;

    Directory dropped.

    SQL> select * from dba_directories;

    SQL> create directory backup as '/u01/backup';

    Directory created.

    SQL> select * from dba_directories;

    OWNER DIRECTORY_NAME            DIRECTORY_PATH

    ----- ------------------------- ------------------------------------------------

    SYS   BACKUP                    /u01/backup

     

    3)注意事项:

           我这里是使用sys用户来进行操作的。 如果是其他用户,那么就需要对这个用户进行赋权。

    SQL> grant create any directory to system;

    Grant succeeded.

     

    SQL> select * from dba_sys_privs where grantee='SYSTEM';

     

    grantee        privilege                       adm

    ------------------------------ ----------------------------  ------------

    system        create any directory             no

    system       global query rewrite              no

    system       create materialized view          no

    system       create table                     no

    system       unlimited tablespace             yes

    system       select any table                  no

     

           如果是其他用户使用sys创建的目录,也需要进行赋权,如:

    SQL> grant read,write on directory backup to SYSTEM;

    Grant succeeded.

     

     

    2. 创建测试数据

           我们需要演示expdp/impdp的一些功能,所以需要创建2个用户和对应的表空间,并且创建一些测试的数据。 SQL 代码如下:

     

    SQL> create tablespace dave datafile '/u01/app/oracle/oradata/dave/dave01.dbf' size 50m;

    SQL> create tablespace bl datafile '/u01/app/oracle/oradata/dave/bl01.dbf' size 50m;

    SQL> create user dave identified by dave default tablespace dave temporary tablespace temp;

    SQL> create user bl identified by bl default tablespace bl temporary tablespace temp;

    SQL> grant read,write on directory backup to dave,bl;

    SQL> grant connect,resource to dave,bl;

     

     

    SQL> conn dave/dave;

    Connected.

    SQL> create table dave(id number,name varchar2(10));

    Table created.

    SQL> begin

      2  for i in 1 .. 10 loop

      3  insert into dave values(i,'dave');

      4  end loop;

      5  end;

      6  /

    PL/SQL procedure successfully completed.

    SQL> commit;

    Commit complete.

    SQL> select * from dave;

            ID NAME

    ---------- ----------

             1 dave

             2 dave

             3 dave

             4 dave

             5 dave

             6 dave

             7 dave

             8 dave

             9 dave

            10 dave

    10 rows selected.

     

    SQL> conn bl/bl;

    Connected.

    SQL> create table bl(id number,name varchar2(10));

     

    Table created.

     

    SQL> begin

      2  for i in 10 .. 20 loop

      3  insert into bl values(i,'bl');

      4  end loop;

      5  commit;

      6  end;

      7  /

     

    PL/SQL procedure successfully completed.

     

    SQL> select * from bl;

     

            ID NAME

    ---------- ----------

            10 bl

            11 bl

            12 bl

            13 bl

            14 bl

            15 bl

            16 bl

            17 bl

            18 bl

            19 bl

            20 bl

     

    11 rows selected.

     

     

    3. 开始测试

    3.1 FULL=Y全库导出

    1)不指定Job_name

    [oracle@qs-dmm-rh2 ~]$ expdp /'/ as sysdba/' directory=backup full=y dumpfile=fullexp.dmp logfile=fullexp.log parallel=2;

     

    -- 注意使用sys 的格式,还有full=y 导出的是非syssystem用户的对象。

    Export: Release 10.2.0.4.0 - Production on Friday, 18 March, 2011 15:05:54

     

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

     

    Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production

    With the Partitioning, OLAP, Data Mining and Real Application Testing options

    Starting "SYS"."SYS_EXPORT_FULL_02":  '/******** AS SYSDBA' directory=backup full=y dumpfile=fullexp.dmp logfile=fullexp.log parallel=2

    Estimate in progress using BLOCKS method...

    Processing object type DATABASE_EXPORT/SCHEMA/TABLE/TABLE_DATA

    Total estimation using BLOCKS method: 18.68 MB

    ……

    ……

    Master table "SYS"."SYS_EXPORT_FULL_02" successfully loaded/unloaded

    ******************************************************************************

    Dump file set for SYS.SYS_EXPORT_FULL_02 is:

      /u01/backup/fullexp.dmp

    Job "SYS"."SYS_EXPORT_FULL_02" successfully completed at 15:07:27

     

           expdp/impd Job形式的,会调用DBMS_DATAPUMP PL/SQL包,这个API提供高速的导出导入功能;还有DBMS_METADATA PL/SQL包,这个包是将metadata(对象定义)存储在XML里。 所有的进程都能load unload 这些metadata

           在备份期间,会自动的生成一张与Job_name 相同名称的表, 该表在备份期间保存metadata数据。 当备份技术后,自动删除该表。

           我们可以使用SQL

                  SQL>select *  FROM dba_datapump_jobs

           查看Job 的信息。 如果意外情况导致备份Job失败,那么对应保存metadata的表,还是会存在。 这个时候,如果查询dba_datapump_jobs,会显示该Jobnot running 这时候,我们只需要drop 掉对应的表,在查询dba_datapump_jobs 就没有记录了。 这个也是一种处理方法。

          

           在开始我就说了,这里没有指定Job name 所以系统自动给我们生成了一个:SYS_EXPORT_FULL_02

           默认是从SYS_EXPORT_FULL_01开始,因为我之前有一个没有运行的Job,所以这里从2开始了。

     

    2)指定Job_name

    [oracle@qs-dmm-rh2 ~]$ expdp /'/ as sysdba/' directory=backup full=y dumpfile=fullexp3.dmp logfile=fullexp3.log parallel=2 job_name=daveJob;

    --在这里我指定了Job_name

    Export: Release 10.2.0.4.0 - Production on Friday, 18 March, 2011 15:29:56

     

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

     

    Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production

    With the Partitioning, OLAP, Data Mining and Real Application Testing options

    Starting "SYS"."DAVEJOB":  '/******** AS SYSDBA' directory=backup full=y dumpfile=fullexp3.dmp logfile=fullexp3.log parallel=2 job_name=daveJob

    Estimate in progress using BLOCKS method...

    Processing object type DATABASE_EXPORT/SCHEMA/TABLE/TABLE_DATA

    Total estimation using BLOCKS method: 18.68 MB

    ……

    ……

    ……

    Master table "SYS"."DAVEJOB" successfully loaded/unloaded

    ******************************************************************************

    Dump file set for SYS.DAVEJOB is:

      /u01/backup/fullexp3.dmp

    Job "SYS"."DAVEJOB" successfully completed at 15:31:06

     

     

    3.2 全库导入

    [oracle@qs-dmm-rh2 archivelog]$ impdp /'/ as sysdba/' directory=backup full=y dumpfile=fullexp3.dmp logfile=fullexp3.log parallel=2 job_name=daveJob table_exists_action=replace;

     

           注意: 导入的过程会生成归档日志,所以,如果是Data Guard 环境,只需要导入主库就可以了。

     

     

    3.3  导出表

    $ expdp  /'/ as sysdba/' directory=backup dumpfile=table.dmp logfile=table.log tables=dave.dave,dave.dba;

    注意: 这里必须是同一个schema下的表

     

    或者:

    $expdp  dave/dave directory=backup dumpfile=table.dmp logfile=table.log tables=dave, dba;

     

    3.4 导入表

    $impdp dave/dave directory=backup dumpfile=table.dmp logfile=table.log tables=dave,dba;

     

     

    3.5 导出用户

    $ expdp  /'/ as sysdba/' directory=backup dumpfile=user.dmp logfile=user.log schemas=dave,bl;

     

    这里是同时导出多个用户

     

    3.6 导入用户

    $ impdp  /'/ as sysdba/' directory=backup dumpfile=user.dmp logfile=user.log schemas=dave,bl table_exists_action=replace;

     

     

    3.7 导出表空间

    $ expdp  /'/ as sysdba/' directory=backup dumpfile=tbs.dmp logfile=tbs.log tablespaces=dave,bl;

     

    --同时导出2个表空间

     

    3.8 导入表空间

    $ impdp  /'/ as sysdba/' directory=backup dumpfile=user.dmp logfile=user.log tablespaces=dave table_exists_action=replace;

    --导入一个表空间

     

    $ impdp  /'/ as sysdba/' directory=backup dumpfile=user.dmp logfile=user.log tablespaces=dave,bl table_exists_action=replace;

     

    --导入2个表空间

     

    3.9  REMAP_SCHEMA

           该选项用于将源方案的所有对象装载到目标方案中.  我们导出dave 用户下的表,然后把它导入bl用户下。

     

    $ expdp  /'/ as sysdba/' directory=backup dumpfile=user.dmp logfile=user.log schemas=dave;

     

    $ impdp  /'/ as sysdba/' directory=backup dumpfile=user.dmp logfile=user.log remap_schema=dave:bl;

     

    验证一下:

    SQL> conn bl/bl;

    Connected.

    SQL> select count(*) from dave;

     

      COUNT(*)

    ----------

            10

     

    3.10  REMAP_TABLESPACE

           将源表空间的所有对象导入到目标表空间中,我们将dave表空间下的对象导入到bl表空间下。

     

    $ expdp  /'/ as sysdba/' directory=backup dumpfile=tbs.dmp logfile=tbs.log tablespaces=dave;

     

    $ impdp  /'/ as sysdba/' directory=backup dumpfile=user.dmp logfile=user.log remap_tablespace=dave:bl table_exists_action=replace;

     

     

    3.11  REMAP_DATAFILE

           该全库导出时有用,用于将源数据文件名转变为目标数据文件名,在不同平台之间搬移表空间时可能需要该选项。比如把dbunix导入到win下,全库导出时里面有create tablespace的语法,这样就有datafile的语法,里面就有路径,导入到win时创建tablespace时的路径就不能是unix下的路径了,此时可以通过该参数remap一下路径:

           remap_datafile=/oradata/orcl/dave01.dbf:e:/oradata/orcl/dave01.dbf

    全库导出:

    $expdp /'/ as sysdba/' directory=backup full=y dumpfile=fullexp3.dmp logfile=fullexp3.log parallel=2 job_name=daveJob;

     

    全库导入:

    $impdp  /'/ as sysdba/' directory=backup dumpfile=fullexp3.dmp logfile=tbs.log full=y remap_datafile='/u01/app/oracle/oradata/dave/dave01.dbf':'/u01/app/oracle/oradata/dave/tianlesoftware01.dbf';

     

    如果这里的remap 文件比较多,可以把这部分单独拿出来,放到一个文件里。

     

    $impdp  /'/ as sysdba/' directory=backup dumpfile=fullexp3.dmp logfile=tbs.log full=y parfile=payroll.par

     

    payroll.par 内容:

    remap_datafile='/oradata/orcl/system01.dbf':'/u01/oradata/orcl/system01.dbf'

    remap_datafile='/oradata/orcl/sysaux01.dbf':'/u01/oradata/orcl/sysaux01.dbf'

    remap_datafile='/oradata/orcl/undotbs4.dbf':'/u01/oradata/orcl/undotbs4.dbf'

    remap_datafile='/oradata/orcl/test02.dbf':'/u01/oradata/orcl/test02.dbf'

     

    如果是windows系统,需要加双引号:

    remap_datafile="'d:/orcl/system01.dbf':'e:/orcl/system01.dbf'"

     

     

     

    3.12  TRANSPORT_DATAFILES

           该选项表示的是表空间的传输。用于指定搬移空间时要被导入到目标数据库的数据文件。

     

    这种方法的操作步骤如下:

    1)将表空间改成read only 状态,然后copy 待传输的表空间的所有数据文件到目标库。 这里可以进行重命名。

           SQL> alter tablespace dave read only;

    2)按transport 方式导出表空间。如:

           expdp directory=backup dumpfile=tts.dmp transport_tablespaces=dave

           注意:这步操作只把metadata,即元数据,只有定义,没有data导入了dump文件。 实际的data 我们在第一步已经copy 过去了。

    3import 我们的数据。 如:

           impdp hr directory=dpump_dir1 dumpfile=tts.dmp transport_datafiles='/user01/data/workers.dat'

    4)将表空间改成read write

           SQL>alter tablespace dave read write ;

           SQL>select * from dba_tablespaces ;
           SQL>select * from dba_data_files ;

     

           元数据(metadata)从我们的dump文件导入,Data Pump将实际的data从我们指定的workers.dat 导入。 这里必须写绝对路劲。

     

    我们看个实例:

    1)先对表空间Dave 添加一个数据文件:

           SQL> alter tablespace dave add datafile '/u01/dave02.dbf' size 20m;

           Tablespace altered.

    2copy 到其他实例的对应位置

    在移动之前先将表空间改成read only 状态:

           SQL> alter tablespace dave read only;

     

           将表空间下的所有数据文件移动到其他的实例上。可以进行重命令。 我这里是同一个实例。 因为我这里是一个实例。 我将我们刚才添加的数据文件dave02.dbf 移动到/u01/app/oracle/oradata/dave下。 expdp 完成后,我们将表空间drop掉,在import进来。

     

    $ cp /u01/dave02.dbf /u01/app/oracle/oradata/dave/bl02.dbf

     

    dave01.dbf 复制成bl03.dbf. 等会删除表空间,不然会被删除掉。

    $ cp dave01.dbf bl03.dbf

     

     

    3expdp 导出元数据

     

    $expdp /'/ as sysdba /' directory=backup dumpfile=tts.dmp transport_tablespaces=dave

     

    4import 数据

     

    先把表空间drop掉在import

    SQL> drop tablespace dave including contents and datafiles;

    Tablespace dropped.

     

     

    $ impdp /'/ as sysdba /' directory=backup dumpfile=tts.dmp transport_datafiles='/u01/app/oracle/oradata/dave/bl02.dbf', '/u01/app/oracle/oradata/dave/bl03.dbf'

     

    注意一点: 这里transport 的表空间,在另一个实例上是不可以存在的。 不然不能导入。

     

    如果文件很多,也可以写入个配置文件里。 导入时通过PARFILE参数来指定。

     

     

    5)将表空间改成read write模式:

    SQL> select tablespace_name,status from dba_tablespaces;

     

    TABLESPACE_NAME                STATUS

    ------------------------------ ---------

    SYSTEM                         ONLINE

    UNDOTBS1                       ONLINE

    SYSAUX                         ONLINE

    TEMP                           ONLINE

    USERS                          ONLINE

    DAVE                           READ ONLY

    BL                             ONLINE

     

    7 rows selected.

     

    SQL> alter tablespace dave read write;

    Tablespace altered.

     

    SQL> select tablespace_name,status from dba_tablespaces;

    TABLESPACE_NAME                STATUS

    ------------------------------ ---------

    SYSTEM                         ONLINE

    UNDOTBS1                       ONLINE

    SYSAUX                         ONLINE

    TEMP                           ONLINE

    USERS                          ONLINE

    DAVE                           ONLINE

    BL                             ONLINE

     

    7 rows selected.

     

    transport_datafiles 注意的几点:

    1)表空间所有的数据文件都要copy到目标库。

    2copy 之间,将表空间改成read only 状态。

    3copy之后可以对数据文件进行重命名。 所以,transport_datafiles 也可以用来对数据文件进行重命名和移动位置。

    4transport_datafiles 完成之后,不要忘记将表空间改成读写模式。

     

     

     

     

     

     

    ---------------------------------------------------------------------------------------------------

    Blog http://blog.csdn.net/tianlesoftware

    网上资源: http://tianlesoftware.download.csdn.net

    相关视频:http://blog.csdn.net/tianlesoftware/archive/2009/11/27/4886500.aspx

    DBA1 群:62697716(); DBA2 群:62697977() DBA3 群:62697850()  

    DBA 超级群:63306533(); DBA4 群: 83829929 DBA5群: 142216823

    聊天 群:40132017

    --加群需要在备注说明Oracle表空间和数据文件的关系,否则拒绝申请

    道森Oracle,国内最早、最大的网络语音培训机构,我们提供专业、优质的Oracle技术培训和服务! 我们的官方网站:http://www.daosenoracle.com 官方淘宝店:http://daosenpx.taobao.com/
  • 相关阅读:
    XUartPs_SetFifoThreshold
    函数指针 与 指针函数 的 区别
    zynq SPI 参数配置
    20199118《网络攻防实践》第三周作业
    maven项目将第三方jar包打入自己的jar中
    springboot项目简单的实现操作多数据库源
    WebSocket简单的应用
    怎么使用bat脚本更改本地受保护的hosts文件
    Spring Boot配置ssl证书启用HTTPS协议
    控制animation暂停:animation-play-state
  • 原文地址:https://www.cnblogs.com/tianlesoftware/p/3609754.html
Copyright © 2020-2023  润新知