当前位置:网站首页>Detailed explanation of ORACLE expdp/impdp
Detailed explanation of ORACLE expdp/impdp
2022-08-02 13:42:00 【Huawei cloud】
一、ORACLE数据泵
ORCALE10G
提供了新的导入导出工具,数据泵.
Oracle官方对此的形容是:
Oracle DataPump technology enables Very High-Speed movement of data and metadata from one database to another.
其中Very High-Speed是亮点.
先说数据泵提供的主要特性(包括,但不限于):
- 支持并行处理导入、导出任务;
- 支持暂停和重启动导入、导出任务;
- 支持通过
Database Link
的方式导出或导入远端数据库中的对象;- 支持在导入时通过
Remap_schema、Remap_datafile、Remap_tablespace
几个参数实现导入过程中自动修改对象属主、
数据文件或数据所在表空间;- 导入/导出时提供了非常细粒度的对象控制.通过
Include、Exclude
两个参数,甚至可以详细制定是否包含或不包含某个对象.
二、什么是Directory对象
Directory
对象是Oracle10g
版本提供的一个新功能.他是一个指向,指向了操作系统中的一个路径.每个Directory都包含 Read,Write两个权限,可以通过Grant命令授权给指定的用户或角色.拥有读写权限的用户就可以读写该Directory对象指定的操作系统路径下的文件.
- 除了使用
network_link
参数意外,expdp
生成的文件都是在服务器上(Directory指定的位置)
2.1 如何调用
- 命令行方式
最简单的调用,但是写的参数有限,建议使用参数文件的方式. - 参数文件方式
最常用的方式.通常需要先编写一个参数文件.指定导出时需要的各种参数.然后以如下方式调用.
expdp user/pwd parfile=xxx.par
这个xxx.par即是编辑的参数文件.注意,在这个命令行后面,同样可以再跟别的参数, 甚至是在par参数文件中指定过的参数.
如果执行命令中附加的参数与参数文件中的参数有重复,最终采用哪个参数,会以参数最后出现的位置而定.如:expdp user/pwd parfile=xxx.par logfile=a.log
,如果在参数文件中也指定了logfile,这里会以命令行中的logfile为准;如:expdp user/pwd logfile=a.log parfile=xxx.par
,而这个,则会以参数文件中的为准,因为parfile=xxx.par写在命令行的后面.
- 交互方式
Data Pump
导入导出任务支持停止,重启等状态操作.如用户执行导入或者导出任务,执行了一半时,使用Crtl+C中断了任务(或其他原因导致的中断),此时任务并不是被取消,而是被转移到后台.可以再次使用expdp/impdp命令,附加attach参数的方式重新连接到中断的任务中,并选择后续的操作. 这就是交互方式.
2.2 什么是attach参数
每执行一个导入,或者导出,在命令的第一行,会有以下信息:
Starting “BAM”.”SYS_EXPORT_SCHEMA_01″:bam/******** parfile=expdp_tbs.par
这个SYS_EXPORT_SCHEMA_01
就是我们的attach参数.
三、操作模式
- 全库模式
导入或者导出整个数据库,对应impdp/expdp
命令中的full参数,只有拥有dba或者exp_full_database
和imp_full_database
权限的用户才能执行. - Schema模式
导出或导入Schema下的自有对象,对应impdp/expdp
命令中的Schema参数,这是默认的操作模式. 如果拥有dba或者exp_full_database
和imp_full_database
权限的用户执行的话,就可以导出或导入多个Schema
中的对象. - 表模式
导出指定的表或者表分区(如果有分区的话)以及依赖该表的对象(如该表的索引,约束等,不过前提是这些对象在同一个Schema
中,或者执行的用户有相应的权限).对应impdp/expdp
命令中的Table参数. - 表空间模式
导出指定的表空间中的内容.对应impdp/expdp
中的Tablespaces
参数,这种模式类似于表模式和 Schema模式的补充. - 传输表空间模式
对应impdp/expdp
中的Transport_tablespaces
参数.这种模式与前面几种模式最显著的区别是生成的Dump文件中并不包含具体的逻辑数据,而只导出相关对象的元数据(即对象的定义,可以理解成表的创建语句),逻辑数据仍然在表空间的数据文件中,导出时需要将元数据和数据文件同时复制到目标端服务器.这种导出方式效率很高,时间开销主要是花在复制数据文件产生的I/O上.expdp执行传输表空间模式的导出,用户必须 拥有 exp_full_database角色或者DBA角色.而通过传输表空间模式导入时,用户必须拥有imp_full_database角色或者DBA角 色. - 过滤数据
过滤数据主要依赖于Query和Sample两个参数.其中Sample参数主要针对expdp导出功能. - Query
与exp命令中的Query功能类似,不过Expdp中,该参数功能得到了增强,控制的粒度更细.Expdp中的Query也是指定类似where语句来限定记录.语法如下:
Query = [Schema.][Table_name:] Query_clause
默认情况如果不指定Schema.table_name
,则Query_clause
针对所有导出的表有效,或者你可以为每一个表指定不同的Query_clause
,如:导出a表中所有id<5的记录,导出b表中所有name=’a’的记录,则Query的参数应该如下:
Query=A:”Where id<5″,B:”Where name=’a’”
如果Where
条件前没有指定Schema
名或者表名的话,默认就是针对当前所有要被导出的表.如:Query=Where id <5
注️: 建议把Query参数放入到参数文件中使用,以避免转义符带来的麻烦.
- Sample
该参数用来指定导出数据的百分比,可指定的值的范围从0.000001到99.999999,语法如下:
Sample=[[Schema_name.]Table_name:]sample_percent
指定该参数以后,EXPDP导出将自动控制导出的记录量,如导出A表中50%的记录,设置的Sample参数如下:
Sample=A:50
注: Sample_percent指定的值只是一个参考值,EXPDP会根据数据量算出一个近似值.
四、过滤对象
过滤对象主要依赖于Include和Exclude两个参数.这两个参数作用正好相反,在这两个参数中,可以指定你知道的任何对象类型(如:Package、Procedure、Table等等)或者对象名称(支持通配符).
- Exclude 反规则
指定不被包含的对象类型或者对象名称.指定了该参数以后,指定的对象类型对应的所有对象都不会被导入或导出. 如果被排除的对象有依赖的对象,那么其依赖的对象也不会被导入或导出.如:通过Exclude参数指定不导出表对象的话,不仅指定的表不会被导出,连这些表关联的Index、Check等都不会被导出.
注: 建议把Exclude参数放入到参数文件中使用,以避免转义符带来的麻烦.
- Include 正规则
与Exclude
正好相反.指定包含的对象类型或者对象名称.
注️: 由于两个参数功能正好相反,因此在执行导入或导出命令时,两个参数不能同时使用,否则Oracle也不知道你想要干什么.
exclude/include
参数用法:
EXCLUDE=[object_type]:[name_clause],[object_type]:[name_clause] --排出特定对象INCLUDE=[object_type]:[name_clause],[object_type]:[name_clause] --包含特定对象
object_type
子句用于指定对象的类型,如table,sequence,view,procedure,package
等等
name_clause
子句可以为SQL表达式用于过滤特定的对象名字.它由SQL操作符以及对象名(可使用通配符)来过滤指定对象类型中的特定对象.
当未指定name_clause
,而仅仅指定object_type
则所有该类型的对象都将被过滤或筛选.多个[object_type]:[name_clause]中间以逗号分割.
示例:
expdp <other_parameters> SCHEMAS=scott EXCLUDE=SEQUENCE,TABLE:"IN ('EMP','DEPT')"impdp <other_parameters> SCHEMAS=scott INCLUDE=PACKAGE,FUNCTION,PROCEDURE,TABLE:"='EMP'"
常用的过滤SQL表达式
EXCLUDE=SEQUENCE,VIEW --过滤所有的SEQUENCE,VIEWEXCLUDE=TABLE:"IN ('EMP','DEPT')" --过滤表对象EMP,DEPTEXCLUDE=SEQUENCE,VIEW,TABLE:"IN ('EMP','DEPT')" --过滤所有的SEQUENCE,VIEW以及表对象EMP,DEPTEXCLUDE=INDEX:"= 'INDX_NAME'" --过滤指定的索引对象INDX_NAMEINCLUDE=PROCEDURE:"LIKE 'PROC_U%'" --包含以PROC_U开头的所有存储过程(_ 符号代表任意单个字符)INCLUDE=TABLE:"> 'E' " --包含大于字符E的所有表对象`
直接将过滤操作符封装到参数文件中,如下面的例子
Parameter file:exp_scott.parDIRECTORY = dump_scottDUMPFILE = exp_scott_%U.dmpLOGFILE = exp_scott.logSCHEMAS = scottPARALLEL= 2EXCLUDE = TABLE:"IN ('EMP', 'DEPT')"
命令行下转义符的处理
Windows平台:
D:\> expdp system/manager DIRECTORY=my_dir DUMPFILE=exp_tab.dmp LOGFILE=exp_tab.log SCHEMAS=scottINCLUDE=TABLE:\"IN ('EMP', 'DEPT')\"
在Windows平台下,需要对象双引号进行转义,使用转义符\
Unix平台:
在未使用parfile文件的情形下,所有的符号都需要进行转义,包括括号,双引号,单引号等
expdp system/manager DIRECTORY=my_dir DUMPFILE=exp_tab.dmp LOGFILE=exp_tab.log SCHEMAS=scottINCLUDE=TABLE:\"IN \(\'EMP\', \'DEP\'\)\"
exclude/include常见的错误
任意需要转义的字符如果未转义或转义错误,都会产生ORA错误.下面给出几种常见的ORA错误.
- ORA-39001: invalid argument value
- ORA-39071: Value for INCLUDE is badly formed.
- ORA-00936: missing expression
- ORA-39071: Value for EXCLUDE is badly formed.
- ORA-00904: “DEPT”: invalid identifier
- ORA-39041: Filter “INCLUDE” either identifies all object types or no object types.
- ORA-39041: Filter “EXCLUDE” either identifies all object types or no object types
- ORA-39038: Object path “USER” is not supported for TABLE jobs.
五、高级过滤
在导出/导入的时候,我们常常有这样的需求,只想导出/导入表结构,或者只想导出/导入数据.幸运的是数据泵也提供了该功能.使用 Content参数.该参数有三个属性
ALL
: 导出/导入对象定义和数据,该参数的默认值就是ALLDATA_ONLY
: 只导出/导入数据.METADATA_ONLY
: 只导出/导入对象定义.
注: 有一点值得注意的是,在执行导出的时候,如果使用了高级过滤,如只导出了数据,那么导入时,需要确保数据定义已经存在.否则数据都变成没有主子了.如果数据定义已经存在,导入时最好指定data_only,否则会触发ORA-39151错误,因为对象已经存在了.
5.1 过滤已经存在的数据
我们知道,导入的表对象在目标库中已经存在,并且目标端没有创建数据完整性约束条件(RI)来检验数据的话,就有可能造成数据被重复导入.数据泵提供了一个新的参数Table_exists_action
,可以一定程度上降低重复数据的产生.该参数用来控制如果要导入的表对象存在,执行什么操作.有以下几个参数值:
SKIP
: 跳过该表,继续处理下一个对象.该参数默认就是SKIP
.值得注意的是,如果你同时指定了CONTENT
参数为Data_only
的话,SKIP
参数无效,默认为APPEND
.APPEND
: 向现有的表中添加数据.TRUNCATE
:TRUNCATE
当前表,然后再添加记录.使用这个参数需要谨慎,除非确认当前表中的数据确实无用.否则可能造成数据丢失.REPLACE
: 删除并重建表对象,然后再向其中添加数据.值得注意的是,如果同时指定了CONTENT
参数为Data_only
的话,REPLACE
参数无效.
5.2 重定义表的Schema或表空间
我们还可能会遇到这样的需求,把A用户的对象转移到B用户,或者更换数据的表空间.数据泵通过Remap_Schema
和Remap_tablespace
参数实现了该功能.
REMAP_SCHEMA
: 重定义对象所属Schema
该参数的作用类似IMP中的Fromuser+Touser,支持多个Schema的转换,语法如下:
REMAP_SCHEMA=Source_schema:Target_schema[,Source_schema:Target_schema]
如把A的对象转换到b用户,将C转换到D用户.Remap_schema=a:b,c:d
注️: 不能在同一个IMPDP命令中指定remap_schema=a:b,a:c.
REMAP_TABLESPACE
: 重定义对象所在的表空间.
该参数用来重映射导入对象存储的表空间,支持同时对多个表空间进行转换,相互间用逗号分割.语法如下:
REMAP_TABLESPACE=Source_tablespace:Target_tablespace[,Source_tablespace:Target_tablespace]
注️: 如果使用Remap_tablespace
参数,则要保证导入的用户对目标表空间有读写权限.
5.3 优化导入/导出效率
对于大数据量来说,我们不得不考虑效率问题.数据泵对效率也提出了更高的要求.甚至官方的描述就是
Oracle Data Pump technology enables Very High-Speed movement of data and metadata from one database to another.
这里的Very High-Speed依赖我们的parallel参数.
所有的优化操作都会有三种结果:变得更好、没有变化、变得更差.Parallel
参数也是这样,并不是指定一个大于1的参数,性能就会有提升.
- 对于导出的
parallel
对于导出来说,由于dump
文件只能由一个线程进行操作(包括I/O处理),因此如果输出的DUMP文件只有一个,即使你指定再多的并行,实际工作仍然是一个,而且还会触发ORA-39095错误.因此,建议设置该参数小于或等于生成的DUMP
文件数量.那么,如何控制生成的DUMP
文件数量呢?
EXPDP
命令提供了一个FILESIZE
参数,用来指定单个DUMP
文件的最大容量,要有效的利用parallel
参数,filesize
参数必不可少.
举例:某用户对象占用了4G左右的空间,实际导出后的DUMP文件约为3G,我们尝试在导出该用户时指定并行度为4,设置单个文件不超过500M,则语法如 下:
expdp user/pwd directory=dump_file dumpfile=expdp_20100820_%U.dmp logfile=expdp_20100820.log filesize=500M parallel=4
- 对于导入的
parallel
对于导入来说,使用parallel
参数则要简单的多,导入更能体现parallel
参数的优势. 参数设置为几,则认为同时将几张表的内容导入到库中.
举例:某dmp文件中包含了200张表,我们尝试在导入该DMP文件时指定并行度为10,则 语法如下:
impdp user/pwd directory=dump_file dumpfile=expdp_20100820_%U.dmp logfile=impdp_20100820.log parallel=10
边栏推荐
猜你喜欢
【ONE·Data || 排序入门】
C语言提高篇(三)
如何通过DBeaver 连接 TDengine?
This binding to detailed answers
How to create short images and short videos from the media?How to make the click volume reach 10W?
Redis全部
RESTful style (detailed introduction + case implementation)
拯救流浪猫 | 「喵先锋」系列数字版权盲盒明日开抢
单例模式的七种写法,你都知道吗?
【C语言】夏日一题 —— 求最大公约数和最小公倍数
随机推荐
栈 && 队列
好用的php空间,推荐国内三个优质的免费PHP空间[通俗易懂]
【C语言】细品分支结构——if-else语句
【C语言】夏日一题 —— 求最大公约数和最小公倍数
Mysql index details (with pictures and texts)
苹果,与Web3 “八字不合”
【ONE·Data || 排序入门】
[b01lers2020]Welcome to Earth-1
CVE-2020-27986(Sonarqube敏感信息泄漏) 漏洞修复
80篇国产数据库实操文档汇总(含TiDB、达梦、openGauss等)
基于 WeihanLi.Npoi 实现excel导入时纯汉字的日期转换
C语言结构体(入门)
FreeBSD bnxt以太网驱动源码阅读记录三:
Win11怎么修改关机界面颜色?Win11修改关机界面颜色的方法
Singleton pattern of seven kinds of writing, you know?
Flashback Technology of Oracle Database
SQL函数 UPPER
.Net 5.0 Quick Start Redis
【C语言】函数哪些事儿,你真的get到了吗?(2)
LeetCode(剑指 Offer)- 53 - II. 0~n-1中缺失的数字