数据泵与传统导入导出工具比较
1)EXP和IMP是客户端工具程序,它们既可以在可以客户端使用,也可以在服务端使用; 2)EXPDP和IMPDP是服务端的工具程序,他们只能在ORACLE服务端使用,不能在客户端使用; 3)IMP只适用于EXP导出文件,不适用于EXPDP导出文件;IMPDP只适用于EXPDP导出文件,而不适用于EXP导出文件; 4)expdp/impdp 支持并行操作,在资源允许的情况下可以提高效率; 5)数据泵导入工具提供remap选项,可以将已有数据导入到不同的表空间,不同用户。
1)导出表 2)导出方案 3)导出表空间 4)导出数据库
数据泵使用前准备
2.1 在服务器端,创建用于存放dmp 文件的目录
mkdir -p install/dmp
chown -R oracle:dba /install/dmp
由于数据泵为服务端工具,因此需要oracle 用户在此目录有读写权限。否则在执行时,会产生报错。报错信息如下:
ORA-39002: invalid operation
ORA-39070: Unable to open the log file.
ORA-29283: invalid file operation
ORA-06512: at "SYS.UTL_FILE", line 536
ORA-29283: invalid file operation
2.2 在数据库中创建导入导出用directory
create directory test_dmp as '/install/dmp';
如果directory 不存在,在执行数据泵导入导出任务时,会遇到如下报错:
ORA-39002: 操作无效 ORA-39070: 无法打开日志文件 ORA-39087: 目录名 DIR1 无效
2.3 检查系统已经存directory
set lines 200 pages 1000
col owner format a20
col directory_name format a30
col directory_path format a60
select owner,directory_name,directory_path from dba_directories ;
2.4 检查directory权限
set lines 200 pages 1000
col owner format a20
col grantee format a20
col table_name format a30
col PRIVILEGE format a30
select grantee,
owner,
table_name,
privilege
from dba_tab_privs
where table_name = '&directory_name'
order by 1,2;
如果没有足够的权限,在执行数据泵导入导出任务时,会遇到如下报错:
ORA-39002: 操作无效
ORA-39070: 无法打开日志文件
ORA-39087: 目录名 DIR1 无效
2.5 对directory 进行授权
grant read,write on directory test_dmp to public ;
2.6 简单示例
1)数据导出
expdp user01/user01_123 directory=test_dmp dumpfile=t2.dmp log=expt2.log
-rw-r----- 1 oracle asmadmin 52183040 Dec 18 16:04 t1.dmp
-rw-r--r-- 1 oracle asmadmin 1789 Dec 18 16:04 expt1.log
2)数据导入
impdp user01/user01_123 directory=test_dmp dumpfile=t2.dmp schemas=user01 log=impt2.log
数据泵导出场景实例
3.1 全数据库导出
ORA-31631: 需要权限 ORA-39161: 完整数据库作业需要权限
expdp user01/user01_123 directory= test_dmp dumpfile=dmp1.dmp logfile=dmp1.log full=y
3.2 并行全库导出
expdp user01/user01_123 directory=test_dmp dumpfile=dmp_para%U.dmp parallel=2 filesize=20M logfile=parallel.log full=y
3.3 导出指定用户(schema)数据
expdp user01/user01_123 directory=test_dmp dumpfile=dmp_schema.dmp schemas=user01 logfile=dmp_schema.log
3.4 按表空间进导出
expdp user01/user01_123 directory=test_dmp
dumpfile=dmp_tbs%U.dmp tablespaces=users,sysaux parallel=2 filesize=20M logfile=dmptbs.log
3.5 导出表数据
expdp user01/user01_123 directory=test_dmp dumpfile=dmp_tabs%U.dmp tables=t1,t2 filesize=20M logfile=dmptabs.log
3.6 使用查询条件导出表数据
ORA-39001: 参数值无效 ORA-39035: 已经指定了数据过滤器 SUBQUERY
expdp lirl/lirl directory=dump_dir dumpfile=dmp_QUERY%U.dmp
QUERY=T1:\"WHERE OBJECT_NAME LIKE '%TAB%'\" parallel=2 filesize=20M logfile=dmpQUERY.log
3.7 只导出元数据
expdp user01/user01_123 directory=test_dmp
dumpfile=dmp_metadata.dmp content=metadata_only logfile=dmpmetadata.log
数据泵导入场景实例
4.1 导入到不同表空间
impdp lirl/lirl directory=dump_dir dumpfile=dmp_para%U.dmp schemas=test remap_tablespace=users:test_tbs logfile=imp1.log
4.2 表数据已经存在时导入
Truncate 删除已有数据,重新插入 Append 追加数据 Replace 替换现有数据
impdp lirl/lirl directory=dump_dir dumpfile=dmp_para%U.dmp
schemas=test remap_tablespace=users:test_tbs table_exists_action=skip logfile=imp1.log
4.3 提取 ddl 语句
impdp lirl/lirl directory=dump_dir dumpfile=DMP_SCHEMA.DMP schemas=test sqlfile='ddl.sql' logfile=imp1.log
导入导出任务维护
5.1 查询正在运行的数据泵任务
SET LINES 200 PAGES 1000
COL INST_ID FORMAT 9999
COL SESS FORMAT A24
COL OWNER_NAME FORMAT A16
COL JOB_NAME FORMAT A20
COL STATUS FORMAT A12
COL LOGON_TM FORMAT A20
SELECT A.INST_ID,
A.SID||','||A.SERIAL# AS SESS,
B.OWNER_NAME,
B.JOB_NAME,
A.STATUS,
A.SADDR,
TO_CHAR(A.LOGON_TIME,'YYYYMMDD HH24:MI:SS') AS LOGON_TM
FROM GV$SESSION A,
DBA_DATAPUMP_SESSIONS B
WHERE A.INST_ID = B.INST_ID
AND A.SADDR = B.SADDR
ORDER BY 1,2,4
;
5.2 停止数据泵任务
1)使用检查数据泵任务语句获取该任务的job_name ; 2)impdp/expdp user/password attach=job_name 3)stop_job (该命令暂停数据泵任务) 4)kill_job(停止数据泵任务)
错误场景实例
1)磁盘空间不足 2)Flash_scn手动指定时间点,额外开销,引起比较慢,到最后报错 3)Exp如果网络不稳定,影响导出 4)Oracle bug引起导出失败 5)stream pool size太小会引起报错39097 6)并行导出

本文作者:张 芳(上海新炬中北团队)
本文来源:“IT那活儿”公众号

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




