转自:http://blog.csdn.net/panfelix/article/details/42266173
imp,exp学习
/* 导入导出操作必须要注意的是字符集问题:
col parameter for a60
select 'export NLS_LANG="SIMPLIFIED CHINESE"_'||p1.PROPERTY_VALUE||'.'||p2.PROPERTY_VALUE parameter
from
(select PROPERTY_VALUE from database_properties where PROPERTY_NAME='NLS_TERRITORY') p1,
(select PROPERTY_VALUE from database_properties p2 where PROPERTY_NAME='NLS_CHARACTERSET') p2;
PARAMETER
------------------------------------------------------------
export NLS_LANG="SIMPLIFIED CHINESE"_AMERICA.AL32UTF8
1 row selected.
*/
一. exp/imp
(1) exp/imp
1.1 原理对比
(1)expdp/impdp调用Server端的API在执行操作,是数据库内部的job任务。可以远程使用,但是生成的dump 文件存在于服务器上的directory里。
(2)exp用户进程通过服务器进程连接到数据库,开启shadow进程,同时执行select语句查询数据库中的数据,通过buffer cache并通过SQL语句处理层再转移出exp导出文件,即exp进程需要占用服务器上的SGA和PGA资源。imp读取exp导出的.dmp文件,构造DDL语句,插入创建表与其他对象以及添加数据的语句
1.2 exp/imp
'------------------------imp/exp使用帮助----------------------------------
[oracle@felix ~]$ export NLS_LANG="SIMPLIFIED CHINESE"_AMERICA.AL32UTF8
[oracle@felix ~]$ exp help=y
通过输入 EXP 命令和您的用户名/口令, 导出
操作将提示您输入参数:
例如: EXP SCOTT/TIGER
或者, 您也可以通过输入跟有各种参数的 EXP 命令来控制导出
的运行方式。要指定参数, 您可以使用关键字:
格式: EXP KEYWORD=value 或 KEYWORD=(value1,value2,...,valueN)
例如: EXP SCOTT/TIGER GRANTS=Y TABLES=(EMP,DEPT,MGR)
或 TABLES=(T1:P1,T1:P2), 如果 T1 是分区表
USERID 必须是命令行中的第一个参数。
关键字 说明 (默认值) 关键字 说明 (默认值)
--------------------------------------------------------------------------
USERID 用户名/口令 FULL 导出整个文件 (N)
BUFFER 数据缓冲区大小 OWNER 所有者用户名列表
FILE 输出文件 (EXPDAT.DMP) TABLES 表名列表
COMPRESS 导入到一个区 (Y) RECORDLENGTH IO 记录的长度
GRANTS 导出权限 (Y) INCTYPE 增量导出类型
INDEXES 导出索引 (Y) RECORD 跟踪增量导出 (Y)
DIRECT 直接路径 (N) TRIGGERS 导出触发器 (Y)
LOG 屏幕输出的日志文件 STATISTICS 分析对象 (ESTIMATE)
ROWS 导出数据行 (Y) PARFILE 参数文件名
CONSISTENT 交叉表的一致性 (N) CONSTRAINTS 导出的约束条件 (Y)
OBJECT_CONSISTENT 只在对象导出期间设置为只读的事务处理 (N)
FEEDBACK 每 x 行显示进度 (0)
FILESIZE 每个转储文件的最大大小
FLASHBACK_SCN 用于将会话快照设置回以前状态的 SCN
FLASHBACK_TIME 用于获取最接近指定时间的 SCN 的时间
QUERY 用于导出表的子集的 select 子句
RESUMABLE 遇到与空格相关的错误时挂起 (N)
RESUMABLE_NAME 用于标识可恢复语句的文本字符串
RESUMABLE_TIMEOUT RESUMABLE 的等待时间
TTS_FULL_CHECK 对 TTS 执行完整或部分相关性检查
VOLSIZE 写入每个磁带卷的字节数
TABLESPACES 要导出的表空间列表
TRANSPORT_TABLESPACE 导出可传输的表空间元数据 (N)
TEMPLATE 调用 iAS 模式导出的模板名
成功终止导出, 没有出现警告。
[oracle@felix ~]$ imp help=y
Import: Release 11.2.0.4.0 - Production on 星期六 12月 27 02:34:11 2014
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
通过输入 IMP 命令和您的用户名/口令, 导入
操作将提示您输入参数:
例如: IMP SCOTT/TIGER
或者, 可以通过输入 IMP 命令和各种参数来控制导入
的运行方式。要指定参数, 您可以使用关键字:
格式: IMP KEYWORD=value 或 KEYWORD=(value1,value2,...,valueN)
例如: IMP SCOTT/TIGER IGNORE=Y TABLES=(EMP,DEPT) FULL=N
或 TABLES=(T1:P1,T1:P2), 如果 T1 是分区表
USERID 必须是命令行中的第一个参数。
关键字 说明 (默认值) 关键字 说明 (默认值)
--------------------------------------------------------------------------
USERID 用户名/口令 FULL 导入整个文件 (N)
BUFFER 数据缓冲区大小 FROMUSER 所有者用户名列表
FILE 输入文件 (EXPDAT.DMP) TOUSER 用户名列表
SHOW 只列出文件内容 (N) TABLES 表名列表
IGNORE 忽略创建错误 (N) RECORDLENGTH IO 记录的长度
GRANTS 导入权限 (Y) INCTYPE 增量导入类型
INDEXES 导入索引 (Y) COMMIT 提交数组插入 (N)
ROWS 导入数据行 (Y) PARFILE 参数文件名
LOG 屏幕输出的日志文件 CONSTRAINTS 导入限制 (Y)
DESTROY 覆盖表空间数据文件 (N)
INDEXFILE 将表/索引信息写入指定的文件
SKIP_UNUSABLE_INDEXES 跳过不可用索引的维护 (N)
FEEDBACK 每 x 行显示进度 (0)
TOID_NOVALIDATE 跳过指定类型 ID 的验证
FILESIZE 每个转储文件的最大大小
STATISTICS 始终导入预计算的统计信息
RESUMABLE 在遇到有关空间的错误时挂起 (N)
RESUMABLE_NAME 用来标识可恢复语句的文本字符串
RESUMABLE_TIMEOUT RESUMABLE 的等待时间
COMPILE 编译过程, 程序包和函数 (Y)
STREAMS_CONFIGURATION 导入流的一般元数据 (Y)
STREAMS_INSTANTIATION 导入流实例化元数据 (N)
DATA_ONLY 仅导入数据 (N)
VOLSIZE 磁带的每个文件卷上的文件的字节数
下列关键字仅用于可传输的表空间
TRANSPORT_TABLESPACE 导入可传输的表空间元数据 (N)
TABLESPACES 将要传输到数据库的表空间
DATAFILES 将要传输到数据库的数据文件
TTS_OWNERS 拥有可传输表空间集中数据的用户
成功终止导入, 没有出现警告。
[oracle@standby ~]$'
1.3 --exp/imp的工作原理:
exp用户进程通过服务器进程连接到数据库,开启shadow进程,同时执行select语句查询数据库中的数据,通过buffer cache并通过SQL语句处理层再转移出exp导出文件,即exp进程需要占用服务器上的SGA和PGA资源。imp读取exp导出的.dmp文件,构造DDL语句,插入创建表与其他对象以及添加数据的语句
Starting with Oracle7 release 7.3, the Export utility provides two methods for exporting table data:
-- Conventional Path Export:
exp/imp 默认会是传统路径, 这种模式下,是用SELECT 加数据查询出来, 然后写入buffer cache, 在将这些记录写入evaluate buffer. 最后传到Export客户端,在写入dump文件。
-- Direct Path Export:
Example:
imp userid/passwd table=(t1,t2,t3...) file=name.dmp log=file.logname DIRECT=Y buffer=1024000
The default is DIRECT=N, which extracts the table data using the conventional path.
expdp/impdp 默认就是使用直接路径的,所以expdp要比exp块。
直接路径模式下,数据直接从硬盘读取,然后写入PGA, 格式就是export 的格式,不需要转换, 数据再直接传到export 客户端,写入dump 文件。 这种模式没有经过evaluation buffer。 少了一个过程,导出速度提高也是很明显。
1.4 --必需权限
注:做exp/imp 操作的时候如果是非DBA用户,则需要赋予
grant exp_full_database to username;
grant imp_full_database to username;
权限才可,并非必须是DBA用户才可exp/imp操作
1.5 --imp/exp导出三种模式
exp的导出数据的方式:
1、全库导出(这种方式一般不用)
2、按用户导出
3、按表导出
三种模式
(1)表方式,将指定表的数据导出/导入。
导出:导出一张或几张表:$ exp user/pwd file=/dir/xxx.dmp log=xxx.log tables=table1,table2
导出某张表的部分数据:
$ exp user/pwd file=/dir/xxx.dmp log=xxx.log tables=table1 query=\“where col1=\‘…\’and col2 \<…\”
导入:导入一张或几张表
$ imp user/pwd file=/dir/xxx.dmp log=xxx.log tables=table1,table2 fromuser=dbuser touser=dbuser2 commit=y ignore=y
(2)用户方式,将指定用户的所有对象及数据导出/导入。
导出:$ exp user/pwd file=/dir/xxx.dmp log=xxx.log wner=(xx, yy)
只导出数据对象,不导出数据 (rows=n )
$ exp user/pwd file=/dir/xxx.dmp log=xxx.log wner=user rows=n
导入:$ imp user/pwd file=/dir/xxx.dmp log=xxx.log fromuser=dbuser touser=dbuser2 commit=y ignore=y
(3)全库方式,将数据库中的所有对象导出/导入导出:
$ exp user/pwd file=/dir/xxx.dmp log=xxx.log full=ycommit=y ignore=y
导入:$ imp user/pwd file=/dir/xxx.dmp log=xxx.log fromuser=dbuser touser=dbuser2
1.6 imp/exp高级应用
1.6.1 分割成多个文件
以多个固定大小文件方式导出:这种做法通常用在表数据量较大,单个 dump文件可能会超出文件系统的限制的情况
$ exp user/pwd file=1.dmp,2.dmp,3.dmp,…filesize=1000m log=xxx.log full=y
以多个固定大小文件方式导入
$ imp user/pwd file=1.dmp,2.dmp,3.dmp,… filesize=1000m tables=xxx fromuser=dbuser touser=dbuser2 commit=y ignore=y
1.6.2 增量导出/导入
// oracle 9i 以后 exp 不再支持 inctype
必须为 SYS 或 SYSTEM 才可执行增量导出导入
增量导出: 包括三个类型:
(1)“完全”增量导出(Complete) // 备份整个数据库
$ exp user/pwd file=/dir/xxx.dmp log=xxx.log inctype=complete
(2)“增量型”增量导出 导出上一次备份后改变的数据。
$ exp user/pwd file=/dir/xxx.dmp log=xxx.log inctype=incremental
(3) “累计型”增量导出(Cumulative)只导出自上次“完全”导出之后数据库中变化 了的信息。
$ exp user/pwd file=/dir/xxx.dmp log=xxx.log inctype=cumulative
增量导入:$ imp usr/pwd FULL=y inctype=system/restore/inct ype
其中:
SYSTEM: 导入系统对象
RESTORE: 导入所有用户对象
1.6.3 恢复备份数据中的指定表:
若从本地文件恢复,使用如下命令:
imp icdmain/icd fromuser=icdmain touser=icdmain rows=y indexes=n commit=y buffer=65536 feedback=100000 ignore=n file=exp.dmp log=imp.log tables=t1,t2,t3
1.6.4 全库导入的一般步骤
注意:在导出时,需要通过toad或其他工具提取源数据库创建主键和索引的脚本
1. 先全库加 rows=n 把结构导进去
$ imp system/manager file=exp.dmp log=imp.log full=y rows=n indexes=n
2. 使业务用户的触发器失效/删除主键和唯一索引
spool drop_pk_u.sql
select 'alter table '||table_name||' drop constraint '||constraint_name||';'
from user_constraints
where constraint_type in ('P','U');
/
spool off
spool disable_trigger.sql
select 'alter trigger '||trigger_name||' disable;'
from user_triggers;
/
spool off
@drop_pk_u.sql
@disable_trigger.sql
3. 以 ignore=y全库导入$ imp system/manager file=exp.dmp log=imp.log full=y ignore=y
1. 查询数据库user模式中所有的外键约束:
(1)删除所有外键约束:
select 'alter table '||table_name||' drop constraint '||constraint_name||';' from user_constraints where constraint_type='R' ;
(2)禁用所有外键约束:
select 'alter table '||table_name||' disable constraint '||constraint_name||';' from user_constraints where constraint_type='R' ;
(3)启用所有外键约束:
select 'alter table '||table_name||' enable constraint '||constraint_name||';' from user_constraints where constraint_type='R' ;
2. 查看该模式下都包含哪些对象:
select distinct(object_type) from user_objects;
3. 查询所有存储过程:
select dbms_metadata.get_ddl('PROCEDURE',OBJECT_NAME) FROM USER_OBJECTS where object_type='PROCEDURE';
4 .查询该模式下所有sequence
select DBMS_METADATA.GET_DDL('SEQUENCE',OBJECT_NAME) FROM USER_OBJECTS where object_type='SEQUENCE';
5. 查询所有package body
select DBMS_METADATA.GET_DDL('PACKAGE BODY',OBJECT_NAME) FROM USER_OBJECTS where object_type='%PACKAGE BODY%';
**1.7imp/exp优化
1.7.1 优化
1.7.1.1. 加快exp速度
通过上面的分析,知道采用direct path可以提高导出速度。 所以,在使用exp时,就可以采用直接路径模式。 这种模式有2个相关的参数:DIRECT 和RECORDLENGTH参数。
DIRECT参数定义了导出是使用直接路径方式(DIRECT=Y),还是常规路径方式(DIRECT=N)。常规路径导出使用SQL SELECT语句从表中抽取数据,直接路径导出则是将数据直接从磁盘读到PGA再原样写入导出文件,从而避免了SQL命令处理层的数据转换过程,大大提高了导出效率。在数据量大的情况下,直接路径导出的效率优势更为明显,可比常规方法速度提高三倍之多。
和DIRECT=Y配合使用的是RECORDLENGTH参数,它定义了Export I/O缓冲的大小,作用类似于常规路径导出使用的BUFFER参数。建议设置RECORDLENGTH参数为最大I/O缓冲,即65535(64kb)。设置较大的 buffer,如果导出大对象,小buffer会失败。
export文件不在ORACLE使用的驱动器上,不要export到NFS文件系统。
如:exp userid=system/manager full=y direct=y recordlength=65535 buffer=10240000 file=exp_full.dmp log=exp_full.log
加大large_pool_size
UNIX环境:用管道模式直接导入导出来提高 imp/exp的性能
1.7.1.2. 加快imp速度
建立一个indexfile,在数据 import完成后再建立索引。将import文件放在不同的驱动器上,增加DB_BLOCK_BUFFERS增加LOG_BUFFER
用非归档方式运行 ORACLE:ALTER DATABASE NOARCHIVELOG;
建立大的表空间和回滚段,OFFLINE其他回滚段,回滚段的大小为最大表的 1/2 使用 COMMIT=N
使用 ANALYZE=N
单用户模式导入
UNIX环境:用管道模式直接导入导出来提高 imp/exp的性能
1.7.1.3 3. 通过unix/Linux PIPE管道加快exp/imp速度
通过管道导出数据:
(1).通过 mknod -p 建立管道
$ mknod /home/exppipe p // 在目录/home下建立一个管道 exppipe注意参数 p
(2).通过 exp和 gzip导出数据到建立的管道并压缩
$ exp test/test file=/home/exppipe & gzip < /home/exppipe > exp.dmp.gz
$ exp test/test tables=bitmap file=/home/newsys/test.pipe & gzip < /home/newsys/test.pipe > bitmap.dmp.gz
(3).导出成功完成之后删除建立的管道
$ rm -rf /home/exppipe
导出脚本:
###UNIX下 ORACLE数据库通过 PIPE管道进行备份
###### using "export" and "tar" command to bakup oracle datebase #######
trap "" 1 #nohup
LOGFILE=/opt/bakup/log/bakup_ora.log
export LOGFILE
DUMPDIR=/archlog_node1
export DUMPDIR
exec >$LOGFILE 2>&1
echo
echo ' Begin at ' `date`
echo
# clear old result file
cd $DUMPDIR
if [ -f exp.dmp.Z ]
then echo "clear old result file"
rm exp.dmp.Z
fi
# make pipe
mkfifo exp.pipe
chmod a+rw exp.pipe
# gain the dmp.Z file
compress < exp.pipe > exp.dmp.Z &
su -u oracle -c "exp userid=ll/ll file=$DUMPDIR/exp.pipe full=y buffer=20000000"
echo
echo ' exp end at '`date`
echo
# rm pipe
rm exp.pipe
# tar the dmp.Z file to tape
mt -f /dev/rmt/0 rew
tar cvf /dev/rmt/0 exp.dmp.Z
echo
echo ' tar end at '`date`
echo
(4)通过管道导入生成的文件:
1.通过 mknod -p 建立管道
$ mknod /home/exppipe p
2.导入生成的压缩文件
$ imp test/test file=/home/exppipe fromuser=test touser=macro & gunzip < exp.dmp.gz > /home/exppipe
3.删除管道
$ rm –rf /home/exppipe
1.8 IMP 常见问题及解决方法
(1)同义词问题
导出一个或一组指定用户所属的全部表、索引和其他对象
exp system/manager file=felix.dmp log=felix.log owner=felix
exp system/manager file=felix.dmp log=felix.log owner=(felix,felix1,felix2,felix3)
注意:在导出用户时,尽管已经得到了这个用户的所有对象,但是还是不能得到这些对象引用的任何同义词。解决方法是用以下的SQL*Plus命令创建一个脚本文件,运行这个脚本文件可以获得一个重建seapark所属对象的全部公共同义词的可执行脚本,然后在目标数据库上运行该脚本就可重建同义词了。
SET LINESIZE 132
SET PAGESIZE 0
SET TRIMSPOOL ON
SPOOL /u01/seapark.syn
SELECT 'Create public synonym '||synonym_name
||' for '||table_owner||'.'||table_name||';'
FROM dba_synonyms
WHERE table_owner = 'SEAPARK' AND owner = 'PUBLIC';
SPOOL OFF
*(2)字符集问题:
RACLE多国语言设置是为了支持世界范围的语言与字符集,一般对语言提示, 货币形式,排序方式和 CHAR,VARCHAR2,C LOB,LONG 字段的数据的显示等有效。ORACLE 的多国语言设置最主要的两个特性就是国家语言设置与字符集设置,国家语 言设置决定了界面或提示使用的语言种类,字符集决定了数据库保存与字符集有关数据(如文本)时候的编码规则。ORACLE字符集设定,分为数据库字符集和客户端字符集环境设置。
在数据库端,字符集在创建数据库的时候设定,并保存在数据库props$表中。
在客户端的字符集环境比较简单,主要就是环境变量或注册表项 NLS_ LANG,注意 NLS_LANG的优先级别为:参数文件<注册表<环境变量
export NLS_LANG="SIMPLIFIED CHINESE"_AMERICA.AL32UTF8
(3)版本问题
Exp/Imp很多时候,可以跨版本使用,如在版本7与版本8之间导出导入数据,但这样做必须选择正确的版本,规则为:总是使用IMP的版本匹配数据库的版本,如果要导入到 816,则使用816的导入工具。总是使用 EXP 的版本匹配两个数据库中低的那个版本,如在815与816之间互导,则使用815的EXP 工具。
imp和exp版本不能往上兼容: imp 可以导入低版本 exp生成的文件, 不能导入高版本 exp生成的文件。
(4)数据库对象已经存在
一般情况, 导入数据前应该彻底删除目标数据下的表, 序列, 函数/过程,触发器等; 数据库对象已经存在, 按缺省的imp参数, 则会导入失败如果用了参数ignore=y, 会把exp文件内的数据内容导入如果表有唯一关键字的约束条件, 不合条件将不被导入如果表没有唯一关键字的约束条件, 将引起记录重复
*(5)数据库对象有主外键约束
不符合主外键约束时, 数据会导入失败,
解决办法:
先导入主表, 再导入依存表
disable目标导入对象的主外键约束, 导入数据后, 再enable它们
(6)权限不够
如果要把A用户的数据导入B用户下, A用户需要有imp_full_database权限
(7)导入大表( 大于80M ) 时, 存储分配失败
默认的EXP时, compress = Y, 也就是把所有的数据压缩在一个数据块上.
导入时, 如果不存在连续一个大数据块, 则会导入失败. 导出80M以上的大表时, 记得compress= N, 则不会引起这种错误.
****************************************************EXPDP/IMPDP************************************************************
二、expdp/impdp
/* expdp使用
[oracle@standby felixdump]$ expdp help=y
Export: Release 11.2.0.4.0 - Production on 星期六 12月 27 04:57:42 2014
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
数据泵导出实用程序提供了一种用于在 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=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。
[oracle@standby felixdump]$
*************************************impdp使用方法************************************************
[oracle@standby felixdump]$ impdp help=y
Import: Release 11.2.0.4.0 - Production on 星期六 12月 27 05:00:45 2014
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
数据泵导入实用程序提供了一种用于在 Oracle 数据库之间传输
数据对象的机制。该实用程序可以使用以下命令进行调用:
示例: impdp scott/tiger DIRECTORY=dmpdir DUMPFILE=scott.dmp
您可以控制导入的运行方式。具体方法是: 在 'impdp' 命令后输入
各种参数。要指定各参数, 请使用关键字:
格式: impdp KEYWORD=value 或 KEYWORD=(value1,value2,...,valueN)
示例: impdp scott/tiger DIRECTORY=dmpdir DUMPFILE=scott.dmp
USERID 必须是命令行中的第一个参数。
------------------------------------------------------------------------------
以下是可用关键字和它们的说明。方括号中列出的是默认值。
ATTACH
连接到现有作业。
例如, ATTACH=job_name。
CLUSTER
利用集群资源并将 worker 进程分布在 Oracle RAC 上。
有效的关键字值为: [Y] 和 N。
CONTENT
指定要加载的数据。
有效的关键字为: [ALL], DATA_ONLY 和 METADATA_ONLY。
DATA_OPTIONS
数据层选项标记。
有效的关键字为: SKIP_CONSTRAINT_ERRORS。
DIRECTORY
用于转储文件, 日志文件和 SQL 文件的目录对象。
DUMPFILE
要从中导入的转储文件的列表 [expdat.dmp]。
例如, DUMPFILE=scott1.dmp, scott2.dmp, dmpdir:scott3.dmp。
ENCRYPTION_PASSWORD
用于访问转储文件中的加密数据的口令密钥。
对于网络导入作业无效。
ESTIMATE
计算作业估计值。
有效的关键字为: [BLOCKS] 和 STATISTICS。
EXCLUDE
排除特定对象类型。
例如, EXCLUDE=SCHEMA:"='HR'"。
FLASHBACK_SCN
用于重置会话快照的 SCN。
FLASHBACK_TIME
用于查找最接近的相应 SCN 值的时间。
FULL
导入源中的所有对象 [Y]。
HELP
显示帮助消息 [N]。
INCLUDE
包括特定对象类型。
例如, INCLUDE=TABLE_DATA。
JOB_NAME
要创建的导入作业的名称。
LOGFILE
日志文件名 [import.log]。
NETWORK_LINK
源系统的远程数据库链接的名称。
NOLOGFILE
不写入日志文件 [N]。
PARALLEL
更改当前作业的活动 worker 的数量。
PARFILE
指定参数文件。
PARTITION_OPTIONS
指定应如何转换分区。
有效的关键字为: DEPARTITION, MERGE 和 [NONE]。
QUERY
用于导入表的子集的谓词子句。
例如, QUERY=employees:"WHERE department_id > 10"。
REMAP_DATA
指定数据转换函数。
例如, REMAP_DATA=EMP.EMPNO:REMAPPKG.EMPNO。
REMAP_DATAFILE
在所有 DDL 语句中重新定义数据文件引用。
REMAP_SCHEMA
将一个方案中的对象加载到另一个方案。
REMAP_TABLE
将表名重新映射到另一个表。
例如, REMAP_TABLE=HR.EMPLOYEES:EMPS。
REMAP_TABLESPACE
将表空间对象重新映射到另一个表空间。
REUSE_DATAFILES
如果表空间已存在, 则将其初始化 [N]。
SCHEMAS
要导入的方案的列表。
SERVICE_NAME
约束 Oracle RAC 资源的活动服务名和关联资源组。
SKIP_UNUSABLE_INDEXES
跳过设置为“索引不可用”状态的索引。
SOURCE_EDITION
用于提取元数据的版本。
SQLFILE
将所有的 SQL DDL 写入指定的文件。
STATUS
监视作业状态的频率, 其中
默认值 [0] 表示只要有新状态可用, 就立即显示新状态。
STREAMS_CONFIGURATION
启用流元数据的加载
TABLE_EXISTS_ACTION
导入对象已存在时执行的操作。
有效的关键字为: APPEND, REPLACE, [SKIP] 和 TRUNCATE。
TABLES
标识要导入的表的列表。
例如, TABLES=HR.EMPLOYEES,SH.SALES:SALES_1995。
TABLESPACES
标识要导入的表空间的列表。
TARGET_EDITION
用于加载元数据的版本。
TRANSFORM
要应用于适用对象的元数据转换。
有效的关键字为: OID, PCTSPACE, SEGMENT_ATTRIBUTES 和 STORAGE。
TRANSPORTABLE
用于选择可传输数据移动的选项。
有效的关键字为: ALWAYS 和 [NEVER]。
仅在 NETWORK_LINK 模式导入操作中有效。
TRANSPORT_DATAFILES
按可传输模式导入的数据文件的列表。
TRANSPORT_FULL_CHECK
验证所有表的存储段 [N]。
TRANSPORT_TABLESPACES
要从中加载元数据的表空间的列表。
仅在 NETWORK_LINK 模式导入操作中有效。
VERSION
要导入的对象的版本。
有效的关键字为: [COMPATIBLE], LATEST 或任何有效的数据库版本。
仅对 NETWORK_LINK 和 SQLFILE 有效。
------------------------------------------------------------------------------
下列命令在交互模式下有效。
注: 允许使用缩写。
CONTINUE_CLIENT
返回到事件记录模式。如果处于空闲状态, 将重新启动作业。
EXIT_CLIENT
退出客户机会话并使作业保持运行状态。
HELP
汇总交互命令。
KILL_JOB
分离并删除作业。
PARALLEL
更改当前作业的活动 worker 的数量。
START_JOB
启动或恢复当前作业。
有效的关键字为: SKIP_CURRENT。
STATUS
监视作业状态的频率, 其中
默认值 [0] 表示只要有新状态可用, 就立即显示新状态。
STOP_JOB
按顺序关闭作业执行并退出客户机。
有效的关键字为: IMMEDIATE。
[oracle@standby felixdump]$
*/
2.1 数据泵原理
2.1.1 数据泵的工作流程如下:
(1)在命令行执行命令
(2)expdp/impd 命令调用DBMS_DATAPUMP PL/SQL包。 这个API提供高速的导出导入功能。
(3)当data 移动的时候, Data Pump 会自动选择direct path 或者external table mechanism 或者 两种结合的方式。 当metadata(对象定义) 移动的时候,Data Pump会使用DBMS_METADATA PL/SQL包。 Metadata API 将metadata(对象定义)存储在XML里。 所有的进程都能load 和unload 这些metadata.
因为Data Pump 调用的是服务端的API, 所以当一个任务被调度或执行,客户端就可以退出连接,任务Job 会在server端继续执行,随后通过客户端实用程序从任何地方检查任务的状态和进行修改。
Data Pump 反映了整个导出/导入过程的完全革新。不使用常见的 SQL 命令,而是应用专用 API(direct path api etc) 来以更快得多的速度加载和卸载数据
在上面说了expdp/impdp 是JOB,我们可以停止与修改。 因此我们在这里做一个简单测试:
/*
mkdir -p /u01/felixdump
chown -R oracle:oinstall /u01/felixdump
需要对这个用户进行赋权:
select * from dba_sys_privs where grantee='felix';
如果是其他用户使用sys创建的目录,也需要进行赋权,如:
grant read,write on directory backup to felix;
grant create any directory to felix;
select * from dba_directories;
create directory felixdump as '/u01/felixdump';
expdp system/oracle full=y directory=felixdump dumpfile=felix_%U.dmp parallel=2 job_name=felix1
[oracle@standby ~]$ expdp system/oracle full=y directory=felixdump dumpfile=felix_%U.dmp parallel=2 job_name=felix1
Export: Release 11.2.0.4.0 - Production on 星期六 12月 27 03:47:59 2014
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
连接到: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
启动 "SYSTEM"."FELIX1": system full=y directory=felixdump dumpfile=felix_%U.dmp parallel=2 job_name=felix1
正在使用 BLOCKS 方法进行估计...
处理对象类型 DATABASE_EXPORT/SCHEMA/TABLE/TABLE_DATA
^C
--此时进行ctrl+c了,但是任务继续(看status状态为:EXECUTING ),原因:
Export> status
作业: FELIX1
操作: EXPORT
模式: FULL
状态: EXECUTING
处理的字节: 0
当前并行度: 2
作业错误计数: 0
转储文件: /u01/felixdump/felix_%u.dmp
转储文件: /u01/felixdump/felix_01.dmp
写入的字节: 4,096
转储文件: /u01/felixdump/felix_02.dmp
写入的字节: 4,096
Worker 1 状态:
进程名: DW00
状态: EXECUTING
对象方案: OGGADM
对象名: OGGADM
对象类型: DATABASE_EXPORT/SCHEMA/USER
完成的对象数: 23
总的对象数: 23
Worker 并行度: 1
Worker 2 状态:
进程名: DW01
状态: EXECUTING
对象方案: FELIX
对象名: BIG_TABLE
对象类型: DATABASE_EXPORT/SCHEMA/TABLE/TABLE_DATA
完成的对象数: 1
总的对象数: 1,287
完成的行数: 19,665
Worker 并行度: 1
Export> stop_job
是否确实要停止此作业 ([Y]/N): y
是否确实要停止此作业 ([Y]/N): y
是否确实要停止此作业 ([Y]/N): y
...
..
.
--用job_name再次连接到job
-- ATTACH用于在客户会话与已存在导出作用之间建立关联. 如果使用ATTACH选项,在命令行除了连接字符串和ATTACH选项外,不能指定任何其他选
[oracle@standby felixdump]$ expdp system/oracle attach=felix2
Export: Release 11.2.0.4.0 - Production on 星期六 12月 27 03:58:20 2014
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
连接到: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
作业: FELIX2
所有者: SYSTEM
操作: EXPORT
创建者权限: TRUE
GUID: 0B24EEE88A242305E0530E0AA8C073A6
开始时间: 星期六, 27 12月, 2014 3:57:26
模式: FULL
实例: standby
最大并行度: 2
EXPORT 个作业参数:
参数名 参数值:
CLIENT_COMMAND system full=y directory=felixdump dumpfile=felix_%U.dmp parallel=2 job_name=felix2
状态: STOP PENDING
处理的字节: 0
当前并行度: 2
作业错误计数: 0
转储文件: /u01/felixdump/felix_%u.dmp
转储文件: /u01/felixdump/felix_01.dmp
写入的字节: 4,096
转储文件: /u01/felixdump/felix_02.dmp
写入的字节: 4,096
Worker 1 状态:
进程名: DW00
状态: WORK WAITING
Worker 2 状态:
进程名: DW01
状态: EXECUTING
对象方案: FELIX
对象名: BIG_TABLE
对象类型: DATABASE_EXPORT/SCHEMA/TABLE/TABLE_DATA
完成的对象数: 1
总的对象数: 1,288
完成的行数: 117,822
Worker 并行度: 1
Worker 3 状态:
进程名: DW02
状态: WORK WAITING
Export>
*/
2.1.2 expdp/impdp的集中方式:
The two most commonly used methods to move data in and out of databases with Data Pump are the "Direct Path" method and the "External Tables" method.
(1)Direct Path mode.
After data file copying, direct path is the fastest method of moving data. In this method, the SQL layer of the database is bypassed and rows are moved to and from the dump file with only minimal interpretation. Data Pump automatically uses the direct path method for loading and unloading data when the structure of a table allows it.
expdp/impdp 默认就是使用直接路径的,所以expdp要比exp块。
(2)External Tables mode.
If data cannot be moved in direct path mode, or if there is a situation where parallel SQL can be used to speed up the data move even more, then the external tables mode is used. The external table mechanism creates an external table that maps the dump file data for the database table. The SQL engine is then used to move the data. If possible, the APPEND hint is used on import to speed the copying of the data into the database.
Note: When the Export NETWORK_LINK parameter is used to specify a network link for an export operation, a variant of the external tables method is used. In this case, data is selected from across the specified network link and inserted into the dump file using an external table.
(3)Data File Copying mode.
his mode is used when a transport tablespace job is started, i.e.: the TRANSPORT_TABLESPACES parameter is specified for an Export Data Pump job. This is the fastest method of moving data because the data is not interpreted nor altered during the job, and Export Data Pump is used to unload only structural information (metadata) into the dump file.
(4) Network Link Import mode.
This mode is used when the NETWORK_LINK parameter is specified during an Import Data Pump job. This is the slowest of the four access methods because this method makes use of an INSERT SELECT statement to move the data over a database link, and reading over a network is generally slower than reading from a disk.
这种模式很方便,但是速度是最慢的,因为它是通过insert,select + dblink来实现的。 速度慢也由此可见了。
2.2 Expdp/IMPDP命令参数及说明
(1). ATTACH
该选项用于在客户会话与已存在导出作用之间建立关联.语法如下:
ATTACH=[schema_name.]job_name
Schema_name用于指定方案名,job_name用于指定导出作业名.注意,如果使用ATTACH选项,在命令行除了连接字符串和ATTACH选项外,不能指定任何其他选项,示例如下:
Expdp scott/tiger ATTACH=scott.export_job
(2). CONTENT
该选项用于指定要导出的内容.默认值为ALL
CONTENT={ALL | DATA_ONLY | METADATA_ONLY}
当设置CONTENT为ALL 时,将导出对象定义及其所有数据.为DATA_ONLY时,只导出对象数据,为METADATA_ONLY时,只导出对象定义。
Expdp scott/tiger DIRECTORY=dump DUMPFILE=a.dump CONTENT=METADATA_ONLY
(3) DIRECTORY
指定转储文件和日志文件所在的目录,DIRECTORY=directory_object
Directory_object用于指定目录对象名称.需要注意,目录对象是使用CREATE DIRECTORY语句建立的对象,而不是OS 目录。
Expdp scott/tiger DIRECTORY=dump DUMPFILE=a.dump
先在对应的位置创建物理文件夹,如D:/backup
建立目录:
create or replace directory backup as '/opt/oracle/utl_file'
SQL>CREATE DIRECTORY backup as ‘d:/backup’;
SQL>grant read,write on directory backup to SYSTEM;
查询创建了那些子目录:
SELECT * FROM dba_directories;
(4). DUMPFILE
用于指定转储文件的名称,默认名称为expdat.dmp
DUMPFILE=[directory_object:]file_name [,….]
Directory_object用于指定目录对象名,file_name用于指定转储文件名.需要注意,如果不指定directory_object,导出工具会自动使用DIRECTORY选项指定的目录对象:
Expdp scott/tiger DIRECTORY=dump1 DUMPFILE=dump2:a.dmp
(5). ESTIMATE
指定估算被导出表所占用磁盘空间分方法.默认值是BLOCKS。
EXTIMATE={BLOCKS | STATISTICS}
设置为BLOCKS时,oracle会按照目标对象所占用的数据块个数乘以数据块尺寸估算对象占用的空间,设置为STATISTICS时,根据最近统计值估算对象占用空间:
Expdp scott/tiger TABLES=emp ESTIMATE=STATISTICS DIRECTORY=dump DUMPFILE=a.dump
(6). EXTIMATE_ONLY
指定是否只估算导出作业所占用的磁盘空间,默认值为N
EXTIMATE_ONLY={Y | N}
设置为Y时,导出作用只估算对象所占用的磁盘空间,而不会执行导出作业,为N时,不仅估算对象所占用的磁盘空间,还会执行导出操作.
Expdp scott/tiger ESTIMATE_ONLY=y NOLOGFILE=y
(7). EXCLUDE
该选项用于指定执行操作时释放要排除对象类型或相关对象
EXCLUDE=object_type[:name_clause] [,….]
Object_type用于指定要排除的对象类型,name_clause用于指定要排除的具体对象.EXCLUDE和INCLUDE不能同时使用。
Expdp scott/tiger DIRECTORY=dump DUMPFILE=a.dup EXCLUDE=VIEW
(8). FILESIZE
指定导出文件的最大尺寸,默认为0,(表示文件尺寸没有限制)
(9). FLASHBACK_SCN
指定导出特定SCN时刻的表数据。FLASHBACK_SCN=scn_value
Scn_value用于标识SCN值.FLASHBACK_SCN和FLASHBACK_TIME不能同时使用: Expdp scott/tiger DIRECTORY=dump DUMPFILE=a.dmp FLASHBACK_SCN=358523
(10). FLASHBACK_TIME
指定导出特定时间点的表数据
FLASHBACK_TIME=”TO_TIMESTAMP(time_value)”
Expdp scott/tiger DIRECTORY=dump DUMPFILE=a.dmp FLASHBACK_TIME= “TO_TIMESTAMP(’25-08-2004 14:35:00’,’DD-MM-YYYY HH24:MI:SS’)”
(11). FULL
指定数据库模式导出,默认为N。 FULL={Y | N} 。为Y时,标识执行数据库导出.
(12). HELP
指定是否显示EXPDP命令行选项的帮助信息,默认为N。当设置为Y时,会显示导出选项的帮助信息. Expdp help=y
(13). INCLUDE
指定导出时要包含的对象类型及相关对象。INCLUDE = object_type[:name_clause] [,… ]
(14). JOB_NAME
指定要导出作用的名称,默认为SYS_XXX 。JOB_NAME=jobname_string
(15). LOGFILE
指定导出日志文件文件的名称,默认名称为export.log
LOGFILE=[directory_object:]file_name
Directory_object用于指定目录对象名称,file_name用于指定导出日志文件名.如果不指定directory_object.导出作用会自动使用DIRECTORY的相应选项值.
Expdp scott/tiger DIRECTORY=dump DUMPFILE=a.dmp logfile=a.log
(16). NETWORK_LINK
指定数据库链接名,如果要将远程数据库对象导出到本地例程的转储文件中,必须设置该选项.
(17). NOLOGFILE
该选项用于指定禁止生成导出日志文件,默认值为N.
(18). PARALLEL
指定执行导出操作的并行进程个数,默认值为1
(19). PARFILE
指定导出参数文件的名称。PARFILE=[directory_path] file_name
(20). QUERY
用于指定过滤导出数据的where条件
QUERY=[schema.] [table_name:] query_clause
Schema用于指定方案名,table_name用于指定表名,query_clause用于指定条件限制子句.QUERY选项不能与CONNECT=METADATA_ONLY,EXTIMATE_ONLY,TRANSPORT_TABLESPACES等选项同时使用.
Expdp scott/tiger directory=dump dumpfiel=a.dmp Tables=emp query=’WHERE deptno=20’
(21). SCHEMAS
该方案用于指定执行方案模式导出,默认为当前用户方案.
(22). STATUS
指定显示导出作用进程的详细状态,默认值为0
(23). TABLES
指定表模式导出
TABLES=[schema_name.]table_name[:partition_name][,…]
Schema_name用于指定方案名,table_name用于指定导出的表名,partition_name用于指定要导出的分区名.
(24). TABLESPACES
指定要导出表空间列表
(25). TRANSPORT_FULL_CHECK
该选项用于指定被搬移表空间和未搬移表空间关联关系的检查方式,默认为N. 当设置为Y时,导出作用会检查表空间直接的完整关联关系,如果表空间所在表空间或其索引所在的表空间只有一个表空间被搬移,将显示错误信息.当设置为N时,导出作用只检查单端依赖,如果搬移索引所在表空间,但未搬移表所在表空间,将显示出错信息,如果搬移表所在表空间,未搬移索引所在表空间,则不会显示错误信息.
(26). TRANSPORT_TABLESPACES
指定执行表空间模式导出
(27). VERSION
指定被导出对象的数据库版本,默认值为COMPATIBLE.
VERSION={COMPATIBLE | LATEST | version_string}
为COMPATIBLE时,会根据初始化参数COMPATIBLE生成对象元数据;为LATEST时,会根据数据库的实际版本生成对象元数据.version_string用于指定数据库版本字符串.
关于Version 的更多说明,参考:
Export/Import DataPump Parameter VERSION - Compatibility of Data Pump Between Different Oracle Versions [Video] [ID 553337.1]
2.3 expdp/impdp的使用Example:
2.3.1 创建逻辑目录
mkdir -p /u01/felixdump
chown -R oracle:oinstall /u01/felixdump
--对这个用户进行赋权:
select * from dba_sys_privs where grantee='felix';
--如果是其他用户使用sys创建的目录,也需要进行赋权,如:
grant read,write on directory backup to felix;
grant create any directory to felix;
select * from dba_directories;
create directory felixdump as '/u01/felixdump';
--运行导出命令
expdp system/oracle full=y directory=felixdump dumpfile=felix_%U.dmp parallel=2 job_name=felix1
1.Data Pump 导出 expdp
例子:
sql>create directory felixdump as '/u02/felixdump';
sql>grant read, write on directory felixdump to felix;
$expdp felix/abc123 tables=CASES directory=felixdump dumpfile=expCASES_U%.dmp job_name=CASES_EXPORT
$expdp felix/abc123 tables=CASES directory=felixdump dumpfile=expCASES_%U.dmp parallel=4 job_name=Cases_Export
include/exclude 例子:
include=table:"in('DB','TS')"
或者include=table:"like '%E%'"
或者include=function,package,procedure,table:"='EMP'"
或者exclude=SEQUENCE,TABLE:"IN ('EMP','DEPT')"
2.Data Pump 导入 expdp
1)从expdp中获取数据源 exp.dmp
2)复制某个数据库中的一个schema到另一个数据库中。
3) 在同一个数据库中把一个schema中所有的对象复制到另一个schema中。
例子:
1)impdp 的数据源是expdp 导出来的DMP文件
impdp felix/abc123 directory=felixdump dumpfile=expCASES.dmp job_name=cases_import
2)复制某个数据库中的一个schema到另一个数据库中。(首先创建DB_LINK)
--1.newwork_link为目标数据库建立的database_link(DB_LINK),
(用户test 需要grant exp_full_database to TEST; )
create public database link TOLINK
connect to TEST identified by oracle
using '(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.0.20.199)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl)
)
)';
--2.impdp在目标数据库服务器上执行 只能低版本向高版本imp
impdp network_link=TOLINK schemas=test remap_schema=test:link2
3) 在同一个数据库中把一个schema中所有的对象复制到另一个schema中。
--1.创建连接自己的database link:
create public database link system_self connect to system identified by "system" using 'orcl';
数据库链接已创建。
--2.复制hr schema到test schema:
impdp system/system network_link=system_self schemas=hr remap_schema=hr:test
2.4 导出数据范例
1)按用户导
expdp scott/tiger@orcl schemas=scott dumpfile=expdp.dmp DIRECTORY=felixdump;
2)并行进程parallel
expdp scott/tiger@orcl directory=felixdump dumpfile=scott3.dmp parallel=40 job_name=scott3
3)按表名导
expdp scott/tiger@orcl TABLES=emp,dept dumpfile=expdp.dmp DIRECTORY=felixdump;
4)按查询条件导
expdp scott/tiger@orcl directory=felixdump dumpfile=expdp.dmp Tables=emp query='WHERE deptno=20';
5)按表空间导
expdp system/manager DIRECTORY=felixdump DUMPFILE=tablespace.dmp TABLESPACES=temp,example;
6)导整个数据库
expdp system/manager DIRECTORY=felixdump DUMPFILE=full.dmp FULL=y;
2.5 还原数据范例
1)导到指定用户下
impdp scott/tiger DIRECTORY=felixdump DUMPFILE=expdp.dmp SCHEMAS=scott;
2)改变表的owner
impdp system/manager DIRECTORY=felixdump DUMPFILE=expdp.dmp TABLES=scott.dept REMAP_SCHEMA=scott:system;
3)导入表空间
impdp system/manager DIRECTORY=felixdump DUMPFILE=tablespace.dmp TABLESPACES=example;
4)导入数据库
impdb system/manager DIRECTORY=felixdump DUMPFILE=full.dmp FULL=y;
5)追加数据
impdp system/manager DIRECTORY=felixdump DUMPFILE=expdp.dmp SCHEMAS=system TABLE_EXISTS_ACTION=append;
/*
Dumpfile 参数 ,可以用%U 指定(但是imp/exp不能进行指定U%)
expdp xxx/xxx schemas=xxx directory=dump1 dumpfile=xxx_%U.dmp filesize=5g
这样每个文件5G ,xxx_01.dump,xxx_02.dump 这样。
*/
2.4 注意影响empdp和impdp的问题:
2.4.1 NLS_LANG 参数对expdp/impdp 影响:
10G之前exp在导出数据时,数据字符集会依赖于NLS_LANG参数的设置,如果Client端设置了NLS_LANG参数,那么数据会按照NLS_LANG设置的字符集导出,如果没有则按照数据库本身的字符集导出; imp也一样 导入时也会参照NLS_LANG的设置在导入是对字符集做转换。
SQL> ! echo$NLS_LANG
/bin/bash: echoamerican_america.ZHS16GBK: command not found
10G新增的expdp/impdp成为了一个服务器端的工具,也就是说导入导出任务在数据库服务器端运行,而不是在发出expdp/impdp命令的客户端(不过Oracle仍然还是保留了exp/imp工具)。在expdp的时候Oracle不会再依赖和参考NLS_LANG的设置,而是完全按照数据库本身的字符集导出数据,impdp的时候,Oracle会自动判断如果dmp文件中的字符集和目标数据库的字符集不符时会自动对导入数据的字符集做转换。这样可以消除以前由于字符集的问题在导入过程中出现乱码的问题。
2.4.2 未指定filesize影响:
expdp xxx/xxx schemas=xxx directory=dump1 network_link =dbl_65 dumpfile=xxx_01.dump ,xxx_02.dump
这样也可以,但不确定xxx_01.dump增到多大才开始写xxx_02.dump文件。
2.4.3其他
ESTIMATE_ONLY=y 可以估计文件大小。
NETWORK_LINK:这样就可以不必一定在本机expdp,也可以在目标机通过 NETWORK_LINK 把从文件抽到目标机上。
expdp xxx/xxx schemas=xxx directory=dump1 network_link =tianlesoftware dumpfile=xxx_%U.dump filesize=10m
或者用impdp + network_link 实现无文件导入
需要注意,LOB字段可以使用NETWORK_LINK ,而long类型字段会报错,
ORA-31679: Table data object "xx"."SYS_USER" has long columns, and longs can not be loaded/unloaded using a network link
2.4.4 网络和磁盘影响
expdp/impdp 是服务端程序,影响它速度的只有磁盘IO。
exp/imp 可以在服务端,也可以在客户端。所以,它受限于网络和磁盘
*****************************************exp和expdp对比***************************************************
3exp和expdp对比
3.1 exp/imp 与 expdp/impdp 功能上的区别
(1)把用户usera的对象导到用户userb,用法区别在于fromuser=usera touser=userb ,remap_schema='usera':'userb' 。例如
imp system/passwd fromuser=usera touser=userb file=/oracle/exp.dmp log=/oracle/exp.log;
impdp system/passwd directory=expdp dumpfile=expdp.dmp remap_schema='usera':'userb' logfile=/oracle/exp.log;
(2)更换表空间,用exp/imp的时候,要想更改表所在的表空间,需要手工去处理一下,如alter table xxx move tablespace_new之类的操作。用impdp只要用remap_tablespace='tabspace_old':'tablespace_new'
(3)当指定一些表的时候,使用exp/imp 时,tables的用法是 tables=('table1','table2','table3')。expdp/impdp用法是tables='table1','table2','table3'。
(4)是否要导出数据行
exp (ROWS=Y 导出数据行,ROWS=N 不导出数据行)
expdp content(ALL:对象+导出数据行,DATA_ONLY:只导出对象,METADATA_ONLY:只导出数据的记录)
*(5)Dumpfile 参数 ,可以用%U 指定(但是imp/exp不能进行指定U%)
expdp xxx/xxx schemas=xxx directory=dump1 dumpfile=xxx_%U.dmp filesize=5g
这样每个文件5G ,xxx_01.dump,xxx_02.dump 这样。
*(6)进行ctrl + c操作时。imp会被终止,expdp不会被终止。
使用中的优化事项
2.1 exp
通过上面的分析,知道采用direct path可以提高导出速度。 所以,在使用exp时,就可以采用直接路径模式。 这种模式有2个相关的参数:DIRECT 和RECORDLENGTH参数。
DIRECT参数定义了导出是使用直接路径方式(DIRECT=Y),还是常规路径方式(DIRECT=N)。常规路径导出使用SQL SELECT语句从表中抽取数据,直接路径导出则是将数据直接从磁盘读到PGA再原样写入导出文件,从而避免了SQL命令处理层的数据转换过程,大大提高了导出效率。在数据量大的情况下,直接路径导出的效率优势更为明显,可比常规方法速度提高三倍之多。
和DIRECT=Y配合使用的是RECORDLENGTH参数,它定义了Export I/O缓冲的大小,作用类似于常规路径导出使用的BUFFER参数。建议设置RECORDLENGTH参数为最大I/O缓冲,即65535(64kb)。其用法如下:
如:exp userid=system/manager full=y direct=y recordlength=65535 file=exp_full.dmp log=exp_full.log
一些限制如下:
You cannot use the DIRECT=Y parameter when exporting in tablespace-mode (i.e. when specifying the parameter TRANSPORT_TABLESPACES=Y). You can use the DIRECT=Y parameter when exporting in full, user or table mode (i.e.: when specifying FULL=Y or OWNER=scott or TABLES=scott.emp).
--直接路径不能使用在tablespace-mode
The parameter QUERY applies ONLY to conventional path Export. It cannot be specified in a direct path export (DIRECT=Y).
-- 直接路径不支持query 参数。 query 只能在conventional path模式下使用。
In versions of Export prior to 8.1.5, you could not use direct path Export for tables containing objects and LOBs.
-如果exp 版本小于8.1.5,不能使用exp 导入有lob字段的biao。 不过现在很少有有8版本的数据库了。 这点可以忽略掉了。
The BUFFER parameter applies ONLY to conventional path Export. It has no effect on a direct path Export. This BUFFER parameter specifies the size (in bytes) of the buffer used to fetch rows. It determines the maximum number of rows in an array, fetched by Export. For direct path Export, use the RECORDLENGTH parameter to specify the size of the buffer that Export uses for writing to the export file.
-- buffer 选项只对conventional path exp有效。 对于直接路径没有影响。 对于直接路径, 应该设置RECORDLENGTH 参数。
The RECORDLENGTH parameter specifies the length (in bytes) of the file record. You can use this parameter to specify the size of the Export I/O buffer (highest value is 64 kb). Changing the RECORDLENGTH parameter affects only the size of data that accumulates before writing to disk. It does not affect the operating system file block size. If you do not define this parameter, it defaults to your platform-dependent value for BUFSIZ (1024 bytes in most cases).
invoking a Direct path Export with a maximum I/O buffer of 64kb can improve the performance of the Export with almost 50%. This can be achieved by specifying the additional Export parameters DIRECT and RECORDLENGTH
-- 对于直接路径下, RECORDLENGTH参数建议设成64k(65535)。这个值对性能提高比较大。 如:
> exp system/manager FILE=exp_full.dmp LOG=exp_full.log
FULL=y DIRECT=y RECORDLENGTH=65535
> imp system/manager FILE=exp_full.dmp LOG=imp_full.log
FULL=y RECORDLENGTH=65535
2.2 IMP
Oracle Import进程需要花比Export进程数倍的时间将数据导入数据库。某些关键时刻,导入是为了应对数据库的紧急故障恢复。为了减少宕机时间,加快导入速度显得至关重要。没有特效办法加速一个大数据量的导入,但我们可以做一些适当的设定以减少整个导入时间。
(1)避免I/O竞争
Import是一个I/O密集的操作,避免I/O竞争可以加快导入速度。如果可能,不要在系统高峰的时间导入数据,不要在导入数据时运行job等可能竞争系统资源的操作。
(2)增加排序区
Oracle Import进程先导入数据再创建索引,不论INDEXES值设为YES或者NO,主键的索引是一定会创建的。创建索引的时候需要用到排序区,在内存大小不足的时候,使用临时表空间进行磁盘排序,由于磁盘排序效率和内存排序效率相差好几个数量级。增加排序区可以大大提高创建索引的效率,从而加快导入速度。
(3)调整BUFFER选项
Imp参数BUFFER定义了每一次读取导出文件的数据量,设的越大,就越减少Import进程读取数据的次数,从而提高导入效率。BUFFER的大小取决于系统应用、数据库规模,通常来说,设为百兆就足够了。其用法如下:
imp user/pwd fromuser=user1 touser=user2 file=/tmp/imp_db_pipe1 commit=y feedback=10000 buffer=10240000
(4)使用COMMIT=Y选项
COMMIT=Y表示每个数据缓冲满了之后提交一次,而不是导完一张表提交一次。这样会大大减少对系统回滚段等资源的消耗,对顺利完成导入是有益的。
(5)使用INDEXES=N选项
前面谈到增加排序区时,说明Imp进程会先导入数据再创建索引。导入过程中建立用户定义的索引,特别是表上有多个索引或者数据表特别庞大时,需要耗费大量时间。某些情况下,需要以最快的时间导入数据,而索引允许后建,我们就可以使用INDEXES=N 只导入数据不创建索引,从而加快导入速度。
我们可以用INDEXFILE选项生成创建索引的DLL脚本,再手工创建索引。我们也可以用如下的方法导入两次,第一次导入数据,第二次导入索引。其用法如下:
imp user/pwd fromuser=user1 touser=user2 file=/tmp/imp_db_pipe1 commit=y feedback=10000 buffer=10240000 ignore=y rows=y indexes=n
imp user/pwd fromuser=user1 touser=user2 file=/tmp/imp_index_pipe1 commit=y feedback=10000 buffer=10240000 ignore=y rows=n indexes=y
(6)增加 LARGE_POOL_SIZE
如果在init.ora中配置了MTS_SERVICE,MTS_DISPATCHERS等参数,tnsnames.ora中又没有(SERVER=DEDICATED)的配置,那么数据库就使用了共享服务器模式。在MTS模式下,Exp/Imp操作会用到LARGE_POOL,建议调整LARGE_POOL_SIZE到150M。
检查数据库是否在MTS模式下:
SQL>select distinct server from v$session;
如果返回值出现none或shared,说明启用了MTS。
2.3 Expdp/Impdp
据泵与exp/imp 来说性能有很大的提高, 其中影响最大的就是paralle。 可以这么来看: expdp/impdp=exp/imp+direct moe + paralle. 所以, 使用数据泵,要想提高速度,就要设置并行参数。
先看2个参数:
Setting Parallelism
For export and import operations, the parallelism setting (specified with the PARALLEL parameter) should be less than or equal to the number of dump files in the dump file set. If there are not enough dump files, the performance will not be optimal because multiple threads of execution will be trying to access the same dump file.
The PARALLEL parameter is valid only in the Enterprise Edition of Oracle Database 10g.
Using Substitution Variables
Instead of, or in addition to, listing specific filenames, you can use the DUMPFILE parameter during export operations to specify multiple dump files, by using a substitution variable (%U) in the filename. This is called a dump file template. The new dump files are created as they are needed, beginning with 01 for %U, then using 02, 03, and so on. Enough dump files are created to allow all processes specified by the current setting of the PARALLEL parameter to be active. If one of the dump files becomes full because its size has reached the maximum size specified by the FILESIZE parameter, it is closed, and a new dump file (with a new generated name) is created to take its place.
From:
http://download.oracle.com/docs/cd/B19306_01/server.102/b14215/dp_overview.htm#sthref44
如果我们使用如下语句:
expdp full=y directory=dump dumpfile=orcl_%U.dmp parallel=4
那么expdp将为parallel 创建4个文件: ORCL_01.DMP,RCL_02.DMP
,ORCL_03.DMP,RCL_04.DMP。 每个进程一个文件。 这样的话,每个文件的大小会因进程而不同。 可以某个文件很大,某个文件却很小。 要解决这个问题,就是设置filesize 参数。 来指定每个文件的最大值。 这样当一个文件达到最大值的之后,就会创建一个新的文件。
如:
expdp full=y directory=dump dumpfile=orcl_%U.dmp parallel=4 filesize=50M
导出的dump文件和paralle有关系,那么导入也有关系。 paralle要小于dump文件数。 如果paralle 大于dump文件的个数,就会因为超过的那个进程获取不到文件,就不能对性能提高。
一般parall 参数值等于CPU 的个数。而且要小于dump文件的个数。
查看CPU 个数:
SQL> show parameter cpu
注意事项:
(1)导入的时候可能会停在某个地方,比如在创建索引的时候,可能在一个地方停了十几分钟。 这个时候切记不要中断过程。 这个时候可能是需要导入的数据比较多。
可以在不同时段观察下表空间大小的变化。 如果表空间一直在变化,说明还在导入,这个时候耐心等待就好。
查看表空间可以用如下SQL:
/* Formatted on 2010/12/23 13:14:13 (QP5 v5.115.810.9015) */
SELECT a.tablespace_name,
ROUND (a.total_size) "total_size(MB)",
ROUND (a.total_size) - ROUND (b.free_size, 3) "used_size(MB)",
ROUND (b.free_size, 3) "free_size(MB)",
ROUND (b.free_size / total_size * 100, 2) || '%' free_rate
FROM ( SELECT tablespace_name, SUM (bytes) / 1024 / 1024 total_size
FROM dba_data_files
GROUP BY tablespace_name) a,
( SELECT tablespace_name, SUM (bytes) / 1024 / 1024 free_size
FROM dba_free_space
GROUP BY tablespace_name) b
WHERE a.tablespace_name = b.tablespace_name(+);
(2)导出导入的过程,尽量避免用ssh连上服务器,在客户端的ssh里执行备份恢复命令。 因为这样,如果连接中断,备份也就中断了。 可以将备份脚本添加到crontab 里。 让备份在服务器上执行。 这样即使ssh中断,备份和恢复也不受影响。