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);

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值