使用expdp和impdp传输数据

渡边不斯凯
Aug 24, 2017 · 9 min read

如果要对Oracle数据库下的某张表或者某个用户的数据进行导入导出,可以使用的方法并不少,在Oracle11g中,通过使用数据泵方式就是一个很好的选择。

首先来看下expdp的操作说明:(具体方法是: 在 ‘expdp’ 命令后输入
各种参数, 使用关键字来指定各参数。)


以下是可用关键字及其说明。方括号中列出的是默认值。

ATTACH
连接到现有作业。
例如, ATTACH=job_name。

CLUSTER
利用集群资源并将 worker 进程分布在 Oracle RAC 上。
有效的关键字值为: [Y] 和 N。

COMPRESSION
减少转储文件大小。
有效的关键字值为: ALL, DATA_ONLY, [METADATA_ONLY] 和 NONE。

CONTENT
指定要卸载的数据。
有效的关键字值为: [ALL], DATA_ONLY 和 METADATA_ONLY。

DATA_OPTIONS
数据层选项标记。
有效的关键字值为: XML_CLOBS。

DIRECTORY
用于转储文件和日志文件的目录对象。

DUMPFILE
指定目标转储文件名的列表 [expdat.dmp]。
例如, DUMPFILE=scott1.dmp, scott2.dmp, dmpdir:scott3.dmp。

ENCRYPTION
加密某个转储文件的一部分或全部。
有效的关键字值为: ALL, DATA_ONLY, ENCRYPTED_COLUMNS_ONLY, METADATA_ONLY 和 NONE。

ENCRYPTION_ALGORITHM
指定加密的方式。
有效的关键字值为: [AES128], AES192 和 AES256。

ENCRYPTION_MODE
生成加密密钥的方法。
有效的关键字值为: DUAL, PASSWORD 和 [TRANSPARENT]。

ENCRYPTION_PASSWORD
用于在转储文件中创建加密数据的口令密钥。

ESTIMATE
计算作业估计值。
有效的关键字值为: [BLOCKS] 和 STATISTICS。

ESTIMATE_ONLY
计算作业估计值而不执行导出。

EXCLUDE
排除特定对象类型。
例如, EXCLUDE=SCHEMA:”=’HR’”。

FILESIZE
以字节为单位指定每个转储文件的大小。

FLASHBACK_SCN
用于重置会话快照的 SCN。

FLASHBACK_TIME
用于查找最接近的相应 SCN 值的时间。

FULL
导出整个数据库 [N]。

HELP
显示帮助消息 [N]。

INCLUDE
包括特定对象类型。
例如, INCLUDE=TABLE_DATA。

JOB_NAME
要创建的导出作业的名称。

LOGFILE
指定日志文件名 [export.log]。

NETWORK_LINK
源系统的远程数据库链接的名称。

NOLOGFILE
不写入日志文件 [N]。

PARALLEL
更改当前作业的活动 worker 的数量。

PARFILE
指定参数文件名。

QUERY
用于导出表的子集的谓词子句。
例如, QUERY=employees:”WHERE department_id > 10"。

REMAP_DATA
指定数据转换函数。
例如, REMAP_DATA=EMP.EMPNO:REMAPPKG.EMPNO。

REUSE_DUMPFILES
覆盖目标转储文件 (如果文件存在) [N]。

SAMPLE
要导出的数据的百分比。

SCHEMAS
要导出的方案的列表 [登录方案]。

SERVICE_NAME
约束 Oracle RAC 资源的活动服务名和关联资源组。

SOURCE_EDITION
用于提取元数据的版本。

STATUS
监视作业状态的频率, 其中
默认值 [0] 表示只要有新状态可用, 就立即显示新状态。

TABLES
标识要导出的表的列表。
例如, TABLES=HR.EMPLOYEES,SH.SALES:SALES_1995。

TABLESPACES
标识要导出的表空间的列表。

TRANSPORTABLE
指定是否可以使用可传输方法。
有效的关键字值为: ALWAYS 和 [NEVER]。

TRANSPORT_FULL_CHECK
验证所有表的存储段 [N]。

TRANSPORT_TABLESPACES
要从中卸载元数据的表空间的列表。

VERSION
要导出的对象版本。
有效的关键字值为: [COMPATIBLE], LATEST 或任何有效的数据库版本。

— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —

下列命令在交互模式下有效。
注: 允许使用缩写。

ADD_FILE
将转储文件添加到转储文件集。

CONTINUE_CLIENT
返回到事件记录模式。如果处于空闲状态, 将重新启动作业。

EXIT_CLIENT
退出客户机会话并使作业保持运行状态。

FILESIZE
用于后续 ADD_FILE 命令的默认文件大小 (字节)。

HELP
汇总交互命令。

KILL_JOB
分离并删除作业。

PARALLEL
更改当前作业的活动 worker 的数量。

REUSE_DUMPFILES
覆盖目标转储文件 (如果文件存在) [N]。

START_JOB
启动或恢复当前作业。
有效的关键字值为: SKIP_CURRENT。

STATUS
监视作业状态的频率, 其中
默认值 [0] 表示只要有新状态可用, 就立即显示新状态。

STOP_JOB
按顺序关闭作业执行并退出客户机。
有效的关键字值为: IMMEDIATE。

操作步骤(前提是所有的数据都在空间上满足存放,可以先检查数据和磁盘可用空间):

1、首先在操作系统建立数据导出存放的目录给予数据库可访问的权限:

[root@ftestdb /]# mkdir /dump
[root@ftestdb /]# chown -R oracle.dba /dump

2、数据库中建立用于数据泵工作的导出集以及相关权限:

SQL> create directory dump_dir as ‘/dump’;

目录已创建。

SQL> grant read,write on directory dump_dir to coodb;

授权成功。

SQL> grant read,write on directory dump_dir to coovbdb;

授权成功。

3、接下来则用到expdp的命令参数了,导出一个用户下所有的数据,首先看下数据量情况和数据表情况:

SQL> select sum(bytes)/1024/1024/1024 from dba_segments where OWNER=upper(‘coodb’);

SUM(BYTES)/1024/1024/1024
— — — — — — — — — — — — -
343.572266

SQL> select sum(bytes)/1024/1024/1024 from dba_segments where OWNER=upper(‘coovbdb’);

SUM(BYTES)/1024/1024/1024
— — — — — — — — — — — — -
184.515808

SQL> select OWNER,count(*) from dba_tables where OWNER=upper(‘coodb’) or OWNER=upper(‘coovbdb’) group by OWNER;

OWNER COUNT(*)
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —
COODB 1585
COOVBDB 76

SQL>

确认磁盘空间可以支撑导出的数据量。

检查存在lob字段的表:

select distinct (‘TABLE “‘ || a.OWNER || ‘“.”’ || a.TABLE_NAME || ‘“‘)

from dba_tab_columns a

where a.OWNER in (‘COODB’, ‘COOVBDB’)

and a.TABLE_NAME in

(select t.TABLE_NAME

from dba_tab_columns t

where t.OWNER in (‘COODB’, ‘COOVBDB’)

and t.DATA_TYPE in (‘CLOB’, ‘BLOB’))

col segment_name format a30

set pagesize 10000

select a.owner,

a.segment_name,

a.segment_type,

sum(a.bytes) / 1024 / 1024 Bytes_MB

from dba_segments a, dba_lobs b

where a.segment_name = b.segment_name and a.owner in (‘COODB’, ‘COOVBDB’)

group by a.owner, a.segment_name, a.segment_type;

4、开始导出数据:

expdp coodb/passwd schemas=coodb dumpfile=expdp_coodb_parallel_%U.dmp directory=dump_dir parallel=4 ;

监控进度:expdp coodb/ftest attach=jobname

导入数据和导出数据的某些步骤一样都是必须的为创建数据泵文件的目录集及导入用户的权限以及用户和表空间是否一致,当然空间也是要够的。

5、执行导入文件:

impdp coodb/passwd directory=dump_dir dumpfile=expdp_coodb_parallel_%u.dmp schemas=coodb parallel=4 TABLE_EXISTS_ACTION=REPLACE cluster=n&

注意:从单实例到RAC下需要指定cluster=n参数否则报错:

ORA-31693: 表数据对象 “COODB”.”T_SYSLOG” 无法加载/卸载并且被跳过, 错误如下:
ORA-29913: 执行 ODCIEXTTABLEOPEN 调出时出错
ORA-31640: 无法打开要读取的转储文件 “/dump/expdp_coodb_parallel_01.dmp”
ORA-19505: 无法识别文件”/dump/expdp_coodb_parallel_01.dmp”
ORA-27037: 无法获得文件状态
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3

— 待续

)
渡边不斯凯

Written by

我可能抑郁了,

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade