暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

数据泵导入导出常用总结

bestpaydata 2021-04-18
939

总结:

1 所有的操作都带上JOB_NAME,以方便监控进度
2 所有的导出都建议以Schema来做,或Table级,不建议直接全库导出
3 即使是按全库导出的,导入的时候也要通过Schema来限定只导用户数据,不导系统数据
4 按Schema导出的时候,需要考虑Schemas之间的授权问题

EXPDP 操作实例: 
1 创建目录
Create directory dmpdir as '/opt/oracle/temp/'; --指定一个目录用来存储dumpfile
grant read,write on directory dmpdir to mouse;
如果不指定目录,则默认的目录可以通过select * from dba_directories where DIRECTORY_NAME='DATA_PUMP_DIR'; 查询得到,注意空间大小

2 导出表
expdp test/test TABLES=t  directory=dmpdir DUMPFILE=testexpdp.dmp logfile=dump.log JOB_NAME=job99;
3 导出方案(用户)
expdp test/test SCHEMAS=test,mouse directory=dmpdir DUMPFILE=test.dmp   logfile=dump.log JOB_NAME=job99;
4 导出表空间:
expdp system/system tablespaces=test,users directory=dmpdir  DUMPFILE=test.dmp   logfile=dump.log JOB_NAME=job99;
6 导出全库
expdp system/system  full=y directory=dmpdir  DUMPFILE=test.dmp   logfile=dump.log JOB_NAME=job99;
7 带查询导出:注意转义符
expdp test/test TABLES=t QUERY=\"where owner=\'TEST\'\"  directory=dmpdir  DUMPFILE=test.dmp   logfile=dump.log JOB_NAME=job99;
8 导出DDL结构:
expdp test/test SCHEMAS=test content=all|METADATA_ONLY|data_only directory=dmpdir  DUMPFILE=test.dmp   logfile=dump.log JOB_NAME=job99;
9 exclude排它性导出(不导出表t和dept,注意要大写)
expdp test/test schemas=test exclude=table:\"in\(\'T\',\'DEPT\'\)\"  directory=dmpdir  DUMPFILE=test.dmp   logfile=dump.log JOB_NAME=job99;
不导出索引
expdp system/POlcesdfe23 schemas=BPPF_BIS exclude=STATISTICS,INDEX ESTIMATE_ONLY=y directory=MOUSE_DMPDIR;
expdp system/POlcesdfe23 schemas=BPPF_BIS  content=data_only directory=MOUSE_DMPDIR;
content=[ALL], DATA_ONLY and METADATA_ONLY.
data_only 选项也会导出索引的内容吧?会

10 并行加速(用于大数据量情况下的导出):
expdp test/test schemas=test  parallel=4  directory=dmpdir  DUMPFILE=testexpdp_%U.dmp   logfile=dump.log JOB_NAME=job99;
Parallel与filesize=10M 指定文件大小不能共用

RAC环境下:RAC并行导出,可以用Cluster=N解决(11.2.0.3)
expdp system/VXpC91txLm  full=y ESTIMATE_ONLY=y;
expdp system/VXpC91txLm directory=DATA_PUMP_DIR DUMPFILE=full%U.dmp full=y CLUSTER=N PARALLEL=3 JOB_NAME=job99
expdp system/VXpC91txLm attach=job99

ORA-31693: Table data object "YZFKMS"."HSM" failed to load/unload and is being skipped due to error:
ORA-31617: unable to open dump file "/home/oracle/test.dmp" for write
ORA-19505: failed to identify file "/home/oracle/test.dmp"
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory
10 添加JOB_NAME:此次导出进程使用的名称,方便跟踪查询(可选) 
expdp test/test DUMPFILE=test.dmp DIRECTORY=dmpdir SCHEMAS=test job_name=exptest

11 评估需要的空间,不能同时指定dumpfile参数, 时间如何去评估? estimate_only
expdp system/system full=y ESTIMATE_ONLY=y directory=DATADUMP;
--OK
expdp mepf_dev/changeme schemas=mepf_dev ESTIMATE_ONLY=y directory=EXP_DIRCTORY;

12 进入进度监控状态
expdp system/system attach=job99
通过status查看 
//缺少对应的SQL语句

13 高版本向低版本迁移加version参数
expdp mepf_dev/mepf_dev schemas=mepf_dev dumpfile=mepf_dev.dmp directory=dump_dir version='10.2.0.1.0';

14 导出远端数据
本地使用expdp导出远端数据库的数据,通过dblink来连接
dumpfile带日期
expdp system/oracle network_link=test directory=orclbackup dumpfile=`date +%Y%m%d`_full.dmp full=y


IMPDP 操作实例:

导入数据之前一般需要根据表原系统的情况建立好表空间名
1 导入表
impdp test/test TABLES=t DIRECTORY=dmpdir  DUMPFILE=test.dmp  logfile=dump.log JOB_NAME=job99;
--如果导出,导入的表名有变,可以使用remap_table选项
impdp test/test DIRECTORY=dmpdir  DUMPFILE=test.dmp  logfile=dump.log JOB_NAME=job99 remap_table=t1:t;
tables与remap_table需要联用,否则dumpfile里的其它文件也会导入

2 导入方案
只需要把相关的表空间创建好就可以了,不需要创建用户,最好把用户先drop掉
impdp system/system DUMPFILE=test.dmp DIRECTORY=DATA_PUMP_DIR SCHEMAS=test table_exists_action=append


关于这个选项,有4个参数,分别为 skip、append、truncate、replace
skip 是如果已存在表,则跳过并处理下一个对象; ---啥都不做
append是为表增加数据;--数据会重新追加,对象不会重建
truncate是截断表,然后为其增加新数据;--数据先被清空,再重新导入,对象不会重建
replace是删除已存在表,对象会根据dumpfile重建,意味着如果dumpfile没有索引信息,后面才有的,是不会被导入的.最后追加数据
小结:
一般情况下,没有元数据变化的情况下,使用truncate就OK. 如果想使用以前的元数据,就要使用replace。
3 导入到不同的用户
需要imp_full_database权限,mouse用户不能存在
impdp system/system DUMPFILE=test.dmp DIRECTORY=DATA_PUMP_DIR REMAP_SCHEMA=test:mouse

4 全库导入
#impdp system/system dumpfile=full.dmp full=y table_exists_action=append logfile=impdump.log;
impdp system/system dumpfile=full.dmp SCHEMAS=test,mouse table_exists_action=replace logfile=impdump.log;
5 从dump文件中提取DDL信息
impdp test/test DUMPFILE=testexpdp.dmp directory=dump_dir SQLFILE=t.sql 
产生的文件除了包含基本的DDL信息外,还包含其它不知什么信息?

问题记录
1 expdp的默认导出路径可以通过如下语句查询得到;DATA_PUMP_DIR=$ORACLE_BASE/admin/mydb/dpdump
SQL> select * from dba_directories;
 OWNER                          DIRECTORY_NAME                 DIRECTORY_PATH
------------------------------ ------------------------------ --------------------------------------------------------------------------------
SYS                            ORACLE_OCM_CONFIG_DIR          /opt/oracle/product/10.2/db_1/ccr/state
SYS                            DATA_PUMP_DIR                  /opt/oracle/admin/mydb/dpdump/
SYS                            XMLDIR                         /ade/b/1191423112/oracle/rdbms/xml> start

2 expdp默认情况下导出哪些东西,有没有被遗漏的,如JOBS,dblink
JOB可以处理,10g上没有处理,需要重建
dblink还需要测试-需要注意IP问题
3 Sequence迁移的时候会自动处理吗?
可以自动处理
4 以sysdba用户导出:
expdp \"/ as sysdba \" directory=dump_dirbk dumpfile=full20_%u.dmp parallel=2 full=y
expdp \"/ as sysdba \" directory=dump_dirbk dumpfile=full20_%u.dmp parallel=2 full=y
5 dumpfile的字符集问题
dumpfile的字符集与expdp运行所在的服务器对应的db server的字符集一致,跟OS层面的NLS_LANG无关
expdp是服务端的工具,这跟传统的exp不一致,exp是客户端工具,字符集需要考虑的层面涉及到DB,OS
在数据迁移过程中,需要保证,数据库源端与数据库目标端的字符集一致
6 parfile
exp parfile=mouse.par file=`date +%Y%m%d`_mouse.dmp
ouse.par
userid=system/q1w2e3r4
file=back.dmp
buffer=1024000 
rows=y 
tables=(
mouse.TESTOGG,
mouse.TESTLOG
)

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

评论