一、exp/imp与expdp/impdp
1)exp和imp是客户端工具程序,它们既可以在可以客户端使用,也可以在服务端使用。
2)expdp和impdp是服务端的工具程序,他们只能在ORACLE服务端使用, 不能在客户端使用。
3)字符集的问题到expdp/impdp数据泵已经消除,因为expdp/impdp真正的导出导入操作都是在数据库服务器上完成的。
4)expdp/impdp工具需要提前创建一个路径,然后命令中加入参数directory。这个路径的创建原因是因为expdp/impdp是工作于服务器端,而这个路径就是对应的服务器端路径。
5)exp默认是传统路径,这种模式下,是用select来查询数据,然后写入buffer cache,在将这些数据写入evaluate buffer,最后传到export客户端,再写入dump文件。
exp直接路径模式下,直接从硬盘读取数据,然后写入PGA,格式就是export的格式,不需要转换,数据再直接传到export客户端,写入dump文件。这种模式没有经过evaluation buffer,少了一个过程,导出速度提高也是很明显。
exp没有并行参数,要进行并行导出,可以写多条命令同时导出,这种方式可用于特定的数据迁移情况,按表或表空间进行快速数据迁移。
expdp是Oracle 10g上推出的一种先进的数据导出方式,比exp有较大的性能提升,expdp可以看成是exp的升级版,相当于exp + direct mode + parallel。
二、操作
1、创建目录和引用目录
sys@ORCL> create or replace directory dmpdir as '/home/oracle';
Directory created.
sys@ORCL> col OWNER for a10
sys@ORCL> col DIRECTORY_NAME for a30
sys@ORCL> col DIRECTORY_PATH for a50
sys@ORCL> select * from dba_directories where directory_name = 'DMPDIR';
2、常规导入导出
共有参数为:目录,dump文件名,log文件名,含义明显,不再讲解,如:directory=DUMP_DIR dumpfile=abc.dmp logfile=abc.log
以下用...代替表示,如
expdp scott/tiger@db10g ...
impdp scott/tiger@db10g ...
1)按数据表
expdp scott/tiger@db10g tables=EMP,DEPT ...
impdp scott/tiger@db10g tables=EMP,DEPT ...
加参数TABLE_EXISTS_ACTION=APPEND可以将数据导入到已存在的表中
2)按用户
exp/imp中用owner,数据泵中用schema
expdp scott/tiger@db10g schemas=SCOTT ...
impdp scott/tiger@db10g schemas=SCOTT ...
3)按整个数据库
expdp system/password@db10g full=Y ...
impdp system/password@db10g full=Y ...
3、高级导入导出
1)include & exclude & parfile
用于指定导入导出对象。
expdp scott/tiger@db10g schemas=SCOTT include=TABLE:"IN ('EMP', 'DEPT')" ...
expdp scott/tiger@db10g schemas=SCOTT exclude=TABLE:"= 'BONUS'" ...
如果用命令行方式,应用转义字符 \
include=TABLE:\"IN (\'EMP\', \'DEPT\')\"
或者用parfile参数加*.par文件方式,就不需要用转义字符
expdp scott/tiger parfile=mypar.par
root> cat mypar.par
directory=data
logfile=t1.log
dumpfile=t1.dmp
full=yes
exclude=table:"IN('CUSTOMER','ORDOR)"
exclude=schema: "IN ('WMSYS', 'OUTLN')"
也因为如此,强烈推荐使用参数文件在parfile参数中。
Windows:
c:> expdp scott/tiger exclude=TABLE:"IN (\'CUSTOMER\', \'ORDOR\')"
UNIX/Linux:
root> expdp scott/tiger exclude=TABLE:\"IN (\'CUSTOMER\', \'ORDOR\')\"
2) like & in
用于指定导入导出对象。
INCLUDE=TABLE,VIEW,PACKAGE:"LIKE '%API'"
或者
INCLUDE=TABLE
INCLUDE=VIEW
INCLUDE=PACKAGE:"LIKE '%API'"
EXCLUDE=SCHEMA:"LIKE 'SYS%'"
EXCLUDE=SCHEMA:"IN ('OUTLN','SYSTEM','SYSMAN','FLOWS_FILES','APEX_030200','APEX_PUBLIC_USER','ANONYMOUS')"
3)表空间内不同用户的数据导入导出
导出参数文件expdp.par
dumpfile=eSchemasXJ.dmp
logfile=eSchemasXJ.log
directory=dpdumpdir
schemas=xj
导出语句:expdp system/123456 parfile=expdp.par
导入用户已存在:
导入参数文件
dumpfile=eSchemasXJ.dmp
logfile=iSchemasXJ.log
directory=dpdumpdir
remap_schema=xj:xja
导入语句:impdp system/123456 parfile=impdp.par
数据导入成功,但将出现一个错误:
ORA-31684: 对象类型 USER:"XJA" 已存在。
导入用户不存在:
导入参数文件为:
dumpfile=eSchemasXJ.dmp
logfile=iSchemasXJ.log
directory=dpdumpdir
remap_schema=xj:xjb
导入成功,无错误。将创建xjb用户,且密码与xj相同。
4)表空间之间用户的数据导入导出(remap_schema与remap_tablespace同时都要有)
导出参数文件expdp.par
dumpfile=eSchemasXJ.dmp
logfile=eSchemasXJ.log
directory=dpdumpdir
schemas=xj //xj用户下的数据
导出语句:expdp system/123456 parfile=expdp.par
导入用户已存在:
导入参数文件
dumpfile=eSchemasXJ.dmp
logfile=iSchemasXJ.log
directory=dpdumpdir
remap_schema=xj:yyu1 //已存在的用户
remap_tablespace=users:yyds
导入语句:impdp system/123456 parfile=impdp.par
数据导入成功,但将出现一个错误:
ORA-31684: 对象类型 USER:"YYU1" 已存在。
导入用户不存在:
导入参数文件为:
dumpfile=eSchemasXJ.dmp
logfile=iSchemasXJ.log
directory=dpdumpdir
remap_schema=xj:xjx //目标用户不能是xj,因为整个数据库中,用户名称具有唯一性
remap_tablespace=users:yyds
导入成功,无错误。将创建xjx用户,且密码与xj相同。
5)表空间的数据导入导出
导出参数文件
dumpfile=eTablespaceYyds.dmp
logfile=eTablespaceYyds.log
directory=dpdumpdir
tablespaces=yyds
导入表空间已存在:
导入参数文件
dumpfile=eTablespaceYyds.dmp
logfile=iTablespaceYyds.log
directory=dpdumpdir
tablespaces=yyds //此句要与不要效果一样,提示表什么的已存在。
以上是导入yyds。如果已创建了表空间zgms,则以下命令将报错,因为用户已存在。
dumpfile=eTablespaceYyds.dmp
logfile=iTablespaceYyds.log
directory=dpdumpdir
remap_tablespace=yyds:zgmis
改为加上remap_schema=xx:xxx ?用户很多怎么搞?
导入表空间不存在:
导入参数文件
dumpfile=eTablespaceYyds.dmp
logfile=iTablespaceYyds.log
directory=dpdumpdir
tablespaces=newtb
报错,导入失败。
6)全库数据导入导出
导出参数文件
dumpfile=eTablespaceYyds.dmp
logfile=eTablespaceYyds.log
directory=dpdumpdir
full=yes
parallel= 4
导入参数
dumpfile=eTablespaceYyds.dmp
logfile=iTablespaceYyds.log
directory=dpdumpdir
full=yes
导入前,原数据库不能有表空间,数据文件。?