`

DBMS_DATAPUMP

阅读更多
1
DBMS_DATAPUMP包

用来在数据库之间的移动全部或部分数据和元数据。

2
概述

支持功能如下:
    2.1 源和目标数据库可以有不同的硬件,操作系统,字符集,和时区
    2.2 支持所有对象类型和数据类型
    2.3 传输数据库之间的数据和元数据,无需使用任何中间文件
    2.4 可移动数据库的一个子集,根据对象类型和对象的名称
    2.5 Schemas, datafile, tablespace 可在导入时传输.
    2.6 支持断点续传
    2.7 可以修改导入或导出的资源
    2.8 Oracle专有的格式的数据可以被卸载和加载

3
安全模型

DBMS_DATAPUMP包的安全性是通过角色实现

3.1 角色
EXP_FULL_DATABASE
IMP_FULL_DATABASE

4
常量

有几个公共常量定义为DBMS_DATAPUMP.GET_STATUS过程.

4.1 掩码定义
KU$_STATUS_WIP CONSTANT BINARY_INTEGER := 1;

KU$_STATUS_JOB_DESC CONSTANT BINARY_INTEGER := 2;

KU$_STATUS_JOB_STATUS CONSTANT BINARY_INTEGER := 4;

KU$_STATUS_JOB_ERROR CONSTANT BINARY_INTEGER := 8;
 


4.2 转储文件类型定义
通过的DBMS_DATAPUMP.GET_STATUS程序返回的转储文件的类型

KU$_DUMPFILE_TYPE_DISK CONSTANT BINARY_INTEGER := 0;

KU$_DUMPFILE_TYPE_TEMPLATE CONSTANT BINARY_INTEGER := 3;
 


4.3 数据结构
DBMS_DATAPUMP包定义对象类型以下几种:
Worker Status Types

Log Entry and Error Types

Job Status Types

Job Description Types

Status Types

Worker Status Types


5 DBMS_DATAPUMP包子过程和函数
ADD_FILE 添加转储文件, 一般用于导出时,转储文件的空间不足,动态添加其它转储文件.

ATTACH 获取作业队列中先前的数据泵作业

DATA_FILTER 限制接收的行数
DETACH 放弃获取数据泵作业的状态
GET_DUMPFILE_INFO  监视作业的状态或等待作业完成
GET_STATUS 监视作业状态或等待完成作业或API错误的更多详细信息
LOG_ENTRY 插入一个消息记录 到 日志文件
METADATA_FILTER 提供用于限制作业的items.
METADATA_REMAP 重新映射
METADATA_TRANSFORM 传输对象
OPEN 打开一个数据泵作业,并返回句柄
SET_PARALLEL 设置并行度, 导出或导入时这个值不能大于转储文件数

SET_PARAMETER 设置作业选项
START_JOB 开始或继续执行作业
STOP_JOB 停止作业
WAIT_FOR_JOB 等等一个作业直到正常完成或异常退出

6
执行步骤:
    6.1 执行DBMS_DATAPUMP.OPEN 程序创建一个数据泵作业及其基础设施。
    6.2 定义 job 的参数
    6.3 启动 job
    6.4 监视 job 直到完成
    6.5 detach job 或 reattach
    6.6 停止 job
    6.7 如果需要, 重启 job


7
导出示例
  handler := DBMS_DATAPUMP.OPEN('EXPORT','SCHEMA',NULL,'EXAMPLE1','LATEST');

  DBMS_DATAPUMP.ADD_FILE(handler,'example1.dmp','DMPDIR');

  DBMS_DATAPUMP.METADATA_FILTER(handler,'SCHEMA_EXPR','IN (''HR'')');

  DBMS_DATAPUMP.START_JOB(handler);

  percent_done := 0;
  job_state := 'UNDEFINED';
  while (job_state != 'COMPLETED') and (job_state != 'STOPPED') loop
    dbms_datapump.get_status(handler,
           dbms_datapump.ku$_status_job_error +
           dbms_datapump.ku$_status_job_status +
           dbms_datapump.ku$_status_wip, -1, job_state, sts);
    js := sts.job_status;

    if js.percent_done != percent_done
    then
      dbms_output.put_line('*** Job percent done = ' ||
                           to_char(js.percent_done));
      percent_done := js.percent_done;
    end if;

    if (bitand(sts.mask, dbms_datapump.ku$_status_wip) != 0)
    then
      le := sts.wip;
    else
      if (bitand(sts.mask,dbms_datapump.ku$_status_job_error) != 0)
      then
        le := sts.error;
      else
        le := null;
      end if;
    end if;
    if le is not null
    then
      ind := le.FIRST;
      while ind is not null loop
        dbms_output.put_line(le(ind).LogText);
        ind := le.NEXT(ind);
      end loop;
    end if;
  end loop;

  dbms_output.put_line('Job has completed');
  dbms_output.put_line('Final job state = ' || job_state);
  dbms_datapump.detach(handler);




导入示例:
   handler := DBMS_DATAPUMP.OPEN('IMPORT','FULL',NULL,'EXAMPLE2');

   DBMS_DATAPUMP.ADD_FILE(handler ,'example1.dmp','DMPDIR');

   DBMS_DATAPUMP.METADATA_REMAP(handler , 'REMAP_SCHEMA','hr', 'scott');

   BMS_DATAPUMP.SET_PARAMETER(handler , 'TABLE_EXISTS_ACTION','SKIP');
   
   DBMS_DATAPUMP.START_JOB(handler);

   percent_done := 0;
   job_state := 'UNDEFINED';
   while (job_state != 'COMPLETED') and (job_state != 'STOPPED') loop
     dbms_datapump.get_status(h1,
           dbms_datapump.ku$_status_job_error +
           dbms_datapump.ku$_status_job_status +
           dbms_datapump.ku$_status_wip,-1,job_state,sts);
     js := sts.job_status;

     if js.percent_done != percent_done then
       dbms_output.put_line('*** Job percent done = ' ||
           to_char(js.percent_done));
       percent_done := js.percent_done;
     end if;

     if (bitand(sts.mask,dbms_datapump.ku$_status_wip) != 0)
     then
       le := sts.wip;
     else
       if (bitand(sts.mask,dbms_datapump.ku$_status_job_error) != 0)
       then
         le := sts.error;
       else
         le := null;
       end if;
     end if;
    
     if le is not null
     then
       ind := le.FIRST;
       while ind is not null loop
         dbms_output.put_line(le(ind).LogText);
         ind := le.NEXT(ind);
       end loop;
     end if;
  end loop;

  dbms_output.put_line('Job has completed');
  dbms_output.put_line('Final job state = ' || job_state);
  dbms_datapump.detach(handler);
















分享到:
评论

相关推荐

    使用java连接数据库按需生成oracle卸数装数的control、selectSQL、建表ddl语句等文件

    DBMS_DATAPUMP.SET_PARAMETER('myJob', 'TABLE_EXISTS_ACTION', 'REPLACE'); DBMS_DATAPUMP.START_JOB('myJob'); END; / ``` 在Java中,你可以将这些内容写入到一个文本文件,然后将其命名为`.ctl`扩展名。 在你...

    datapump数据泵课件

    Data Pump基于服务器,利用DBMS_DATAPUMP和DBMS_METADATA等内部过程,采用直接路径(Direct Path)写入数据的方式,以XML格式存储元数据,实现了对大量数据的快速处理。 Data Pump的主要特性包括: 1. **高性能**...

    Oracle 19c 数据泵备份恢复实战与应用场景解析

    内容概要:本文详细介绍了 Oracle 19c 数据泵 (Data Pump) 的使用方法,包括数据泵的组件(expdp、impdp、DBMS_DATAPUMP)、与 CDB 和 PDB 的兼容性、数据泵生成的文件类型(SQL 文件、转储文件、日志文件)、目录...

    PLSQL数据库备份详细讲解和实施

    EXECUTE IMMEDIATE 'BEGIN DBMS_DATAPUMP.create_directory(''BACKUP_DIR'', ''' || l_dir || '''); END;'; DBMS_DATAPUMP.start_job ( job_name => 'EXPORT_JOB', remote_link => NULL, operation => 'EXPDP',...

    PL/SQL远程备份和恢复Oracle数据库

    dbms_datapump.add_file(handle => h1, filename => 'EXPDAT.LOG', directory => 'DATA_PUMP_DIR', filetype => 3); dbms_datapump.add_file(handle => h1, filename => 'CHYDB.DMP', directory => 'DATA_PUMP_DIR...

    oracle10g培训讲义07

    - **示例**:使用 `DBMS_DATAPUMP` 包中的 `GET_JOB_STATUS` 过程监视导入状态。 ```plsql DECLARE l_status VARCHAR2(30); BEGIN DBMS_DATAPUMP.GET_JOB_STATUS('SYS', 'mydb_import', l_status); DBMS_...

    oracle逻辑导入导出.pptx

    通过DBMS_DATAPUMP包,用户可以直接在PL/SQL环境中调用数据泵进行数据迁移。 在使用Oracle数据泵时,可以设置各种参数来优化性能,例如指定导出和导入的表空间、压缩选项、并行度等。数据泵的导出会生成一个二进制...

    oracle常用脚本

    6. **数据泵传输(DBMS_DATAPUMP)**:Oracle Data Pump API可以用来在后台进行大规模的数据迁移。它提供了更底层的控制,适用于开发自定义的数据迁移解决方案。 7. **SQL Developer**:Oracle的免费图形化数据库...

    ocp12c最新题库9月份最新更新ocp062.pdf

    - DBMS_DATAPUMP 包含了一系列 PL/SQL 过程和函数,可以直接通过 SQL 或 PL/SQL 调用来执行 Data Pump 操作。这意味着即使没有使用 Data Pump 客户端工具,也可以执行导出和导入操作。 3. **必须存在目录对象,且...

    expdp,impdp常用方法.pdf

    impdp system/systemdb DIRECTORY=DataPump_Dir JOB_NAME=impdp_suolong_job DUMPFILE=lufei.dmp LOGFILE=lufei_to_suolong_impdp.log schemas=lufei remap_schema=lufei:suolong ``` - **参数说明**: - `...

    数据库恢复工具 odu

    它主要由三个部分组成:Data Pump Export( EXPDP)、Data Pump Import(IMPDP)和Data Pump Job Control(DBMS_DATAPUMP)。 2. EXPDP(Data Pump Export): EXPDP用于从数据库中导出数据,生成DMP格式的文件,这...

    oracle_dba常用sql脚本分类文档

    数据库间的迁移或集成通常涉及`CREATE DATABASE LINK`、`INSERT AS SELECT`、`DBMS_DATAPUMP`等操作,以实现数据同步或迁移。 9. 监控与警告: 自定义的SQL脚本可以监控特定数据库指标,并在超过预设阈值时发送...

    Orcl导入数据库书籍

    1. **创建作业**:使用`DBMS_DATAPUMP`包中的`START_LOAD`过程启动导入作业。 2. **执行导入**:Data Pump导入会读取指定的转储文件,并将数据加载到目标数据库中。 3. **完成作业**:导入完成后,使用`END_LOAD`...

    Oracle 数据泵导出和导入.docx

    3. 数据泵通过新的 API 来建立和管理,这些新的工作主要由 DBMS_DATAPUMP 来完成。新的导入/导出工具完全成为了一个客户端应用, 通过 IMPDP/EXPDP 执行的命令实际上都是在调用 Server 端的 API 在执行操作,所以...

    Less18_MovingData_MB3.pdf

    - **DBMS_DATAPUMP**:PL/SQL包,提供对DataPump的编程接口。 #### 六、总结 通过本课程的学习,参与者不仅能够了解Oracle 10g中数据迁移的各种技术,还能掌握具体的实践方法。这些技术的应用对于管理和维护大型...

    oracle10gr2_data_guard.rar_data guard_oracle_oracle data guard

    1. 创建备库:使用DBMS_RAC_ADMIN.SYNC_INSTANCE或RMAN命令创建物理备库,或者通过Logical Standby和Datapump创建逻辑备库。 2. 数据同步:通过Redo Transport Services传输redo日志,备库应用这些日志进行数据更新...

    oracle定时导出

    job_action => 'BEGIN dbms_datapump.export_schema('SCHEMA_NAME', 'FULL', 'DIRECTORY_OBJECT_NAME', 'DUMPFILE_NAME'); END;', start_date => TO_DATE('2023-01-01 01:00:00', 'YYYY-MM-DD HH24:MI:SS'), ...

    Oracle_数据泵导出和导入

    3. **API 驱动的操作模式**:数据泵通过一系列新的 API 进行管理和控制,核心功能由 `DBMS_DATAPUMP` 包提供支持。这意味着所有的导入/导出操作实际上是通过客户端应用调用服务器端 API 来实现的。一旦数据迁移任务...

Global site tag (gtag.js) - Google Analytics