exp/imp和expdp/impdp的逻辑哲学

2013-04-10

oracle数据库中,exp/imp是client工具程序,expdp/impdp是server工具程序,但是在client/server都可以用。

实例:
select * from dba_directories;
create or replace directory expdp_dir1 as '/data1/backup';
grant read,write on directory expdp_dir1 to user01;
grant read,write on directory expdp_dir1 to public;
expdp schemas=scott dumpfile=expdp.dmp DIRECTORY=dpdata1
expdp tables=order dumpfile=contact.dmp DIRECTORY=expdp_dir1 parallel=2 log=act.log COMPRESSION=all
注意在ORACLE 10g下 COMPRESSION只有METADATA_ONLY和NONE两个选项,ORACLE 11g下才有DATA_ONLY选项。
expdp version检查版本。

1、文件不通用
imp只适用exp导出的文件,用expdp导出的文件不适用。
impdp只适用于expdp导出的文件,用exp导出的文件不适用。

expdp/impdb使用时可暂时不指定user/pw@instance,根据提示再输入:
expdp schemas=scott dumpfile=expdp.dmp DIRECTORY=dpdata1

2、查看帮助:

exp help=y

imp help=y

expdp help=y

impdp help=y

3、exp/imp实例

exp/imp {u_name}/{u_pwd}@{local_svrname} fromuser={from_user} touser={u_name} file={dmp_file_path} ignore=y tablespaces={tbs_name};

a)、指定用户
exp user01/password1 file=$bakfile OWNER=user01 log=${today}.log
imp user01/password1 file=$bakfile FULL=y
b)、指定表
exp user01/password1 file=table123.dmp tables=table1,table2,table3;
imp user01/password1 file=table123.dmp tables=table1,table2,table3;

c)、指定查询条件
exp userid/pass tables=(tables1,table2) query=\"where rownum<=10\" file=bak.dmp
exp userid/pass file=account.dmp query=\"where rownum\<\=100\" tables=account

d)、备份脚本 vi exp.sh . ~/.bash_profile today=`date '+%Y-%m-%d'`

exp system/oracle file=/oracle/exp/$today.dmp log=/oracle/exp/$today.log owner=user01 buffer=4096000

#保留30天内备份数据 /usr/bin/find /oracle/exp/*.dmp -ctime +30 -exec rm -rf {} \;

4、为了用impdp/expdp,你需要做一些准备活动: 创建逻辑目录,该命令不会在操作系统创建真正的目录,最好以system等管理员创建。

SQL> create directory data_pump_dir1 as 'f:\dump';
(create directory dir_dump1 as '/data1/dump1';)

给scott用户赋予在指定目录的操作权限,最好以system等管理员赋予。
grant read,write on directory data_pump_dir1 to scott;

SQL> grant read,write on directory data_pump_dir1 to emr;

查看管理理员目录(同时查看操作系统是否存在,因为Oracle并不关心该目录是否存在,如果不存在,则出错)

SQL> col DIRECTORY_PATH format a50
SQL> set linesize 200
SQL> select * from dba_directories;

OWNER DIRECTORY_NAME DIRECTORY_PATH
------------------------------ ------------------------------ --------------------------------------------------
SYS DATA_PUMP_DIR /u02/oracle/10.2.0/rdbms/log/
SYS DPDATA1 /u02/dump
SYS ORACLE_OCM_CONFIG_DIR /u02/oracle/10.2.0/ccr/state

5、操作系统中创建需要的路径:
mkdir f:\dump
mkdir /data1/dump

6、按用户expdp导出:

expdp emr/emr@emr SCHEMAS=emr DUMPFILE=expdp.dmp DIRECTORY=data_pump_dir;

expdb实例:
a)、按用户导
expdp scott/tiger@orcl schemas=scott dumpfile=expdp.dmp DIRECTORY=dpdata1;
b)、并行进程parallel
expdp scott/tiger@orcl directory=dpdata1 dumpfile=scott3.dmp parallel=40 job_name=scott3
c)、按表名导
expdp scott/tiger@orcl TABLES=emp,dept dumpfile=expdp.dmp DIRECTORY=dpdata1;
d)、按查询条件导
expdp scott/tiger@orcl directory=dpdata1 dumpfile=expdp.dmp Tables=emp query='WHERE deptno=20';
e)、按表空间导
expdp system/manager DIRECTORY=dpdata1 DUMPFILE=tablespace.dmp TABLESPACES=temp,example;

exp 'system/123456' tablespaces=TS01 file=ts01.dmp
f)、导整个数据库
expdp system/manager DIRECTORY=dpdata1 DUMPFILE=full.dmp FULL=y;

7、将dmp文件复制到data_pump_dir设定的路径,按用户还原(提前创建好所需的tablespace和user):

impdp emr/emr@emr SCHEMAS=emr DUMPFILE=expdp.dmp DIRECTORY=data_pump_dir;

还原数据实例:
a)、导到指定用户下
impdp scott/tiger DIRECTORY=dpdata1 DUMPFILE=expdp.dmp SCHEMAS=scott;
b)、改变表的owner
impdp system/manager DIRECTORY=dpdata1 DUMPFILE=expdp.dmp TABLES=scott.dept REMAP_SCHEMA=scott:system;
c)、导入表空间
impdp system/manager DIRECTORY=dpdata1 DUMPFILE=tablespace.dmp TABLESPACES=example;
d)、导入数据库
impdb system/manager DIRECTORY=dump_dir DUMPFILE=full.dmp FULL=y;
e)、当使用IMPDP完成数据库导入时,如遇到表已存在时,Oracle提供给我们如下四种处理方式:
a.忽略(SKIP,默认行为);
b.在原有数据基础上继续增加(APPEND);
c.先DROP表,然后创建表,最后完成数据插入(REPLACE);
d.先TRUNCATE,再完成数据插入(TRUNCATE)。
impdp system/manager DIRECTORY=dpdata1 DUMPFILE=expdp.dmp SCHEMAS=system TABLE_EXISTS_ACTION=REPLACE;
8、expdp/impdp的EXCLUDE/INCLUDE用法
EXCLUDE=SEQUENCE,VIEW --过滤所有的SEQUENCE,VIEW
EXCLUDE=TABLE:"IN ('EMP','DEPT')" --过滤表对象EMP,DEPT
EXCLUDE=SEQUENCE,VIEW,TABLE:"IN ('EMP','DEPT')" --过滤所有的SEQUENCE,VIEW以及表对象EMP,DEPT
EXCLUDE=INDEX:"= 'INDX_NAME'" --过滤指定的索引对象INDX_NAME
INCLUDE=PROCEDURE:"LIKE 'PROC_U%'" --包含以PROC_U开头的所有存储过程(_ 符号代表任意单个字符)
INCLUDE=TABLE:"> 'E' " --包含大于字符E的所有表对象

分类:数据库 | 标签: |

相关日志

评论被关闭!