热衷技术,热爱交流
分类: Oracle
2013-08-25 22:06:53
1 数据泵与传统工具exp/imp优劣比较
1.1 优势
(1)Exp/imp是客户端工具,导入导出的效率受到网络影响;数据泵是服务器端工具,直接把转储文件导入到数据库上,不受网路影响。
(2)Exp/imp通常是单线程工作;数据泵实际是实例活动,可以多进程,多cpu并行处理,充分利用硬件资源。
(3)Imp/exp工具必须一次性完成,数据泵支持断续工作。
(4)数据泵优化了默认参数,避免了因为没有设置正确的buffer造成效率底下。
(5)数据泵支持交互操作。
(6)Exp/imp工具仅仅支持trigger, INDEXES、GRANDS、TRIGGERS、CONSTRAINTS和STATISTICS对象的过滤,数据泵则通过include和exclude支持任意类型对象过滤。
(7)对于一些类似功能如指定表空间、过滤导出、加密、压缩,数据泵也做了一些优化,使得效率更高,操作更加简单。
1.2 劣势
(1)数据泵只能在数据库上操作,exp/imp是客户端工具,操作简单方便。
(2)Exp/imp适用于各版本的数据库,支持跨版本数据迁移,数据泵是10g新出的工具,只适用于10g以后的数据库。
综上所述,数据泵远远强于传统工具,下面情况下才考虑使用exp/imp工具
(1)无法直接登录到数据库的操作系统;
(2)网络状况良好,而且导出的数据量很少(例如小表迁移);
(3)据库从9i迁移到高版本;
2 帮助信息:
查看expdp工具的帮助信息,着重关注其功能描述以及默认值。
C:\Users\Administrator>expdp help=y
数据泵导出实用程序提供了一种用于在 Oracle 数据库之间传输
数据对象的机制。该实用程序可以使用以下命令进行调用:
示例: expdp scott/tiger DIRECTORY=dmpdir DUMPFILE=scott.dmp
您可以控制导出的运行方式。具体方法是: 在 'expdp' 命令后输入
各种参数。要指定各参数, 请使用关键字:
格式: expdp KEYWORD=value 或 KEYWORD=(value1,value2,...,valueN)
示例: expdp scott/tiger DUMPFILE=scott.dmp DIRECTORY=dmpdir SCHEMAS=scott
或 TABLES=(T1:P1,T1:P2), 如果 T1 是分区表
USERID 必须是命令行中的第一个参数。
关键字 说明 (默认)
------------------------------------------------------------------------------
ATTACH 连接到现有作业, 例如 ATTACH [=作业名]。
COMPRESSION 减小有效的转储文件内容的大小
关键字值为: (METADATA_ONLY) 和 NONE。
CONTENT 指定要卸载的数据, 其中有效关键字为:
(ALL), DATA_ONLY 和 METADATA_ONLY。
DIRECTORY 供转储文件和日志文件使用的目录对象。
DUMPFILE 目标转储文件 (expdat.dmp) 的列表,
例如 DUMPFILE=scott1.dmp, scott2.dmp, dmpdir:scott3.dmp。
ENCRYPTION_PASSWORD 用于创建加密列数据的口令关键字。
ESTIMATE 计算作业估计值, 其中有效关键字为:
(BLOCKS) 和 STATISTICS。
ESTIMATE_ONLY 在不执行导出的情况下计算作业估计值。
EXCLUDE 排除特定的对象类型, 例如 EXCLUDE=TABLE:EMP。
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 用于导出表的子集的谓词子句。
SAMPLE 要导出的数据的百分比;
SCHEMAS 要导出的方案的列表 (登录方案)。
STATUS 在默认值 (0) 将显示可用时的新状态的情况下,
要监视的频率 (以秒计) 作业状态。
TABLES 标识要导出的表的列表 - 只有一个方案。
TABLESPACES 标识要导出的表空间的列表。
TRANSPORT_FULL_CHECK 验证所有表的存储段 (N)。
TRANSPORT_TABLESPACES 要从中卸载元数据的表空间的列表。
VERSION 要导出的对象的版本, 其中有效关键字为:
(COMPATIBLE), LATEST 或任何有效的数据库版本。
下面从一系列实验出发,重点突出数据泵和传统工具的区别。
3 使用数据泵进行数据导出和导入:
讨论使用数据泵进行数据导入和导出,可以从实际需求出发,参照imp/exp的讨论路线
3.1 单表导出
需求:把system用户的表student导出,而且只需导出age !=50 的记录。
源和数据库操作系统和oracle版本均一致:
服务器:windows server 2008 R2
Oracle:10.2.0.4
(1)登录数据库,建立directory
oracle[~]$sqlplus system/talent@191.255.255.249/hr
SYSTEM >create or replace directory expdir as 'd:\expdir';
由于数据泵是服务器端工具,执行导入时候,需要指定把转储文件导出到什么目录,这里的directory就是这个作用。在指定目录时,还要注意,服务器端是否已经有这个目录,如果没有则新建。
C:\Users\Administrator>mkdir d:\expdir
(2)查看已经建立的directory:
SYSTEM >select * from dba_directories;
OWNER |DIRECTORY_NAME |DIRECTORY_PATH
----------|------------------------------|--------------------------------------------------
SYS |DATA_PUMP_DIR |C:\oracle\product\10.2.0/admin/hr/dpdump/
SYS |ORACLE_OCM_CONFIG_DIR |C:\oracle\product\10.2.0\db_1/ccr/stateSYS |EXPDIR |d:\expdir
3 rows selected.
这里建立的directory所有者是sys,如果其他用户要使用这个direcory,需要授权,否则无法读写这个目录:
SYSTEM >grant read,write on directory expdir to hr;
(3)使用下列脚本进行单表导出:
@echo off
sqlplus system/talent@localhost/hr @student.sql
文件student.sql:
column time new_val ok
select to_char(sysdate,'yyyy-mm-dd') time from dual;
host expdp "'system/talent@localhost/hr'" dumpfile=stuent_&ok..dmp tables=student% query='where age != 50' logfile=student_&ok..log
exit
(4)导出日志包含下列内容:
Db.log:
Data Pump default directory object created:
directory object name: DATA_PUMP_DIR
creation date: 21-2月 -2013 10:39
通过日志看到,由于没有指定directory,导出时候使用系统默认的directory:DATA_PUMP_DIR,可以手动设置这个环境变量。如果没有指定导出文件名和日志文件名,导出的dmp文件和日志文件都自动写到了这个目录,dmp文件名名为expdp.dmp,日志文件名是exp.log。最好指定directory,还要注意授权,让导出时使用的用户对这个directory具备读写权限:
column time new_val ok
select to_char(sysdate,'yyyy-mm-dd') time from dual;
host expdp "'system/talent@localhost/hr'" dumpfile=stuent_&ok..dmp tables=student% query='where age != 50' directory=expdir logfile=student_&ok..log
3.2 单表数据导入
3.2.1 Content
导入时候,如果这表已经存在,会提示失败。Imp导入时候通过ingore=y选项跳过这个错误,继续插入数据,impdp则通过更灵活的参数contents跳过错误:
Content选项的三个值:
All:表示把元数据和数据一起导入.
data_only:表示只是追加数据
metadata_only:表示只导入表元数据,相当于exp中的rows=n。
C:\Users\Administrator>impdp system/talent dumpfile=STUENT_2013-08-25.DMP directory=expdir tables=student content=data_only
3.2.2 过滤导入
imp导入时,如果要忽略索引,可以通过index=n实现,impdp实现则更加灵活一些
C:\Users\Administrator>impdp system/talent dumpfile=STUENT_2013-08-25.DMP directory=expdir tables=student content=data_only EXCLUDE=INDEX
3.2.3 导入数据给其他用户
Imp导入时候,使用fromuser/touser选项指定导入的用户,expdp使用remap_schema选项导入数据给其他用户:
C:\Users\Administrator>impdp system/talent dumpfile=STUENT_2013-08-25.DMP directory=expdir tables=student content=all remap_schema=system:hr
3.2.4 指定表空间
和imp一样,导入时候是数据写入表在源数据库中的表空间,如果目的库不存在对应的表空间时,导入会失败。impdp导入时候可以指定表空间,十分灵活。
C:\Users\Administrator>impdp system/talent dumpfile=STUENT_2013-08-25.DMP directory=expdir tables=student content=all remap_schema=system:hr remap_tablespace=system: hr_SYSTEM_DATA
3.3 模式对象导出
3.3.1 Estimate评估
模式对象导出时,如果导出的数据较多,可以先用estimate参数评估工作量:
Statistics参数有两个值:blocks(默认)和statistics,两者区别:
expdp "'system/talent@localhost/hr'" schemas=hr directory=expdir logfile=student_&ok..log estimate_only=y estimate=statistics
连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
启动 "SYSTEM"."SYS_EXPORT_SCHEMA_01": "system/********@localhost/hr" schemas=hr directory=expdir logfile=student_2013-08-25.log estimate_only=y estimate=statistics
正在使用 STATISTICS 方法进行估计...
处理对象类型 SCHEMA_EXPORT/TABLE/TABLE_DATA
. 预计为 "hr"."TEST11" 391.6 MB
. 预计为 "hr"."hr_D_LEAKAGEBASE" 14.77 MB
. 预计为 "hr"."hr_D_PATCHBASE" 8.520 MB
. 预计为 "hr
. 预计为 "hr"."WF_WORKPROCESS_INS" 0 KB
. 预计为 "hr"."WF_WORKPROCESS_MSG" 0 KB
使用 STATISTICS 方法的总估计: 419.6 MB
作业 "SYSTEM"."SYS_EXPORT_SCHEMA_01" 已于 16:58:59 成功完成
expdp "'system/talent@localhost/hr'" schemas=hr directory=expdir logfile=student_&ok..log estimate_only=y estimate=blocks
连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
启动 "SYSTEM"."SYS_EXPORT_SCHEMA_01": "system/********@localhost/hr" schemas=hr directory=expdir logfile=student_2013-08-25.log estimate_only=y estimate=blocks
正在使用 BLOCKS 方法进行估计...
处理对象类型 SCHEMA_EXPORT/TABLE/TABLE_DATA
. 预计为 "hr"."TEST11" 5.363 GB
. 预计为 "hr"."hr_D_LEAKAGEBASE" 19 MB
. 预计为 "hr"."hr_D_PATCHBASE" 11 MB
. 预计为 "hr"."hr_RESOURCE" 5 MB
. 预计为 "hr"."AAS_AUDIT_REC" 3 MB
. 预计为 "hr"."AAS_POLICY" 2 MB
. 预计为 "hr"."AAS_RESOURCE_SYSTEM" 2 MB
. 预计为 "hr"."AAS_USER" 2 MB
. 预计为 "hr"."RPT_DEF" 2 MB
. 预计为 "hr"."AAS_RESOURCE_DOMAIN" 1024 KB
. 预计为 "hr"."NMS_PORTOFVLAN" 0 KB
. 预计为 "hr"."NMS_PORTRESOURCE" 0 KB
. 预计为 "hr"."NMS_SCANDEVICEINFO" 0 KB
使用 BLOCKS 方法的总估计: 5.466 GB
作业 "SYSTEM"."SYS_EXPORT_SCHEMA_01" 已于 17:02:12 成功完成
3.3.2 过滤导出
使用exp工具进行模式对象导出时,可以根据trigger, INDEXES、GRANDS、TRIGGERS、CONSTRAINTS和STATISTICS进行过滤,expdp可以通过include和exclude参数过滤任意对象。
例如:如果仅仅需要导出函数和序列,可以按照如下方法进行:
C:\Users\Administrator>expdp "'hr/hr@localhost/hr'" schemas=hr directory=expdir dumpfile=hr2.dmp logfile=hr2.log job_name=hr include=function include=sequence
3.3.3 调整并行度
为了充分利用CPU和I/O资源,导入时候可以调整并行度:
impdp "'system/talent@localhost/hr'" schemas=hr directory=expdir dumpfile=hr.dmp logfile=hr1.log job_name=hr parallel=2 exclude=table:"""LIKE 'student%'"""
使用imp导入时,模式对象必须已经存在;使用expdp导入,如果模式不存在,可以自动建立,并且根据源库中的属性自动设置相关属性,例如权限、默认表空间和临时表空间等。
3.3.4 交互操作
在导出时,expdp把传统的exp/imp导出方式转化为了内部的job任务,这样可以手动控制任务,进行暂停、删除与重启等交互操作:
例如:
expdp "'system/talent@localhost/hr'" schemas=hr directory=expdir logfile=student_&ok..log job_name=hr
使用job_name选项后,数据库会为system模式生成一个名字为hr的表,用于记录导出导入进度,Job完成后自动卸载这个表。
导出过程中可以使用ctrl+c进入交互模式。
Export>
查看帮助
Export> help
下列命令在交互模式下有效。
注: 允许使用缩写
命令 说明
------------------------------------------------------------------------------
ADD_FILE 向转储文件集中添加转储文件。
CONTINUE_CLIENT 返回到记录模式。如果处于空闲状态, 将重新启动作业。
EXIT_CLIENT 退出客户机会话并使作业处于运行状态。
FILESIZE 后续 ADD_FILE 命令的默认文件大小 (字节)。
HELP 总结交互命令。
KILL_JOB 分离和删除作业。
PARALLEL 更改当前作业的活动 worker 的数目。
PARALLEL=
。 START_JOB 启动/恢复当前作业。
STATUS 在默认值 (0) 将显示可用时的新状态的情况下,
要监视的频率 (以秒计) 作业状态。
STATUS[=interval]
STOP_JOB 顺序关闭执行的作业并退出客户机。
STOP_JOB=IMMEDIATE 将立即关闭
数据泵作业。
查看当前状态
Export> status
作业: hr
操作: EXPORT
模式: SCHEMA
状态: EXECUTING
处理的字节: 0
当前并行度: 1
作业错误计数: 0
转储文件: D:\EXPDIR\hr.DMP
写入的字节: 4,096
Worker 1 状态:
状态: EXECUTING
对象方案: hr
对象名: WF_STATE_POINT
对象类型: SCHEMA_EXPORT/TABLE/TABLE
完成的对象数: 173
Worker 并行度: 1
暂停job
Export> stop_job
是否确实要停止此作业 ([Y]/N): yes
停止后就退出了这次任务,可以下次连上来,重新开始:
C:\Users\Administrator>expdp "'system/talent@localhost/hr'" attach=hr
作业: hr
所有者: SYSTEM
操作: EXPORT
创建者权限: FALSE
GUID: 0F572B49364D482CBE7FF94DBE211ED1
起始时间: 星期日, 25 8月, 2013 17:33:58
模式: SCHEMA
实例: hr
最大并行度: 1
EXPORT 个作业参数:
参数名 参数值:
CLIENT_COMMAND "system/********@localhost/hr" schemas=hr directory=expdir dumpfile=hr.dmp logfile=hr.log job_name=hr
状态: IDLING
处理的字节: 423,131,416
完成的百分比: 79
当前并行度: 1
作业错误计数: 0
转储文件: d:\expdir\hr.dmp
写入的字节: 424,370,176
Worker 1 状态:
状态: UNDEFINED
Export>
重新开始
Export> start_job
翻屏显示
Export> CONTINUE_CLIENT
使用 BLOCKS 方法的总估计: 5.466 GB
处理对象类型 SCHEMA_EXPORT/USER
处理对象类型 SCHEMA_EXPORT/SYSTEM_GRANT
处理对象类型 SCHEMA_EXPORT/ROLE_GRANT
处理对象类型 SCHEMA_EXPORT/DEFAULT_ROLE
处理对象类型 SCHEMA_EXPORT/TABLESPACE_QUOTA
处理对象类型 SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
处理对象类型 SCHEMA_EXPORT/TYPE/TYPE_SPEC
处理对象类型 SCHEMA_EXPORT/SEQUENCE/SEQUENCE
处理对象类型 SCHEMA_EXPORT/TABLE/TABLE
处理对象类型 SCHEMA_EXPORT/TABLE/INDEX/INDEX