Oracle Data Pump(以下简称数据泵)是Oracle 10g开始提供的一种数据迁移工具,同时也被广大DBA用来作为数据库的逻辑备份工具和体量较小的数据迁移工具。与传统的数据导出/导入工具,即exp/imp工具相比,数据泵更为高效和安全,数据泵主要包含以下三个部分:
- 操作系统命令行客户端,expdp和impdp;
- DBMS_DATAPUMP PL/SQL包(也被认为是Data Pump API);
- DBMS_METADATA PL/SQL包(也被认为是Metadata API)。
DBMS_DATAPUMP包主要执行实际数据的导出和导入工作,expdp和impdp命令也是通过命令行调用该包当中的存储过程实现数据导出导入功能,这个包是数据泵当中最核心的部分;
DBMS_METADATA包主要提供当数据导出导入用于元数据移动时,对元数据内容的提取、修改和重新创建的功能。
本文主要讨论的是命令行工具expdp和impdp。关于数据泵更详细的内容可以参考官方文档说明:Overview of Oracle Data Pump
主要说明
数据泵操作系统命令行分为导出工具expdp,导入工具impdp,对比早期版本的数据导出导入工具而且有着较大的效率性能提高,主要包含以下优点:
- 支持并行地进行数据导出和导入任务;
- 支持暂停、重启动任务;
- 支持更多的对象类型的过滤;
- 支持导入任务中元数据对象的修改、重映射;
- 支持预估导出任务所需的空间大小需求,以便合理规划存储导出任务数据的路径。
环境准备
- 操作系统(OS):CentOS Linux release 7.5.1804 (Core)
- 数据库版本(Oracle Database):Oracle Database 11g R2(11.2.0.4.0)
同时配置了示例SCHEMA和解锁了用户SCOTT、HR。
- 创建数据泵导出导入目录
SYS@dbabd> create directory datapump as '/data/app/datapump';
Directory created.
SYS@dbabd> select directory_name,directory_path from dba_directories;
DIRECTORY_NAME DIRECTORY_PATH
------------------------------ ---------------------------------------------
SUBDIR /data/app/oracle/product/11.2.0/db_1/demo/schema/order_entry//2002/Sep
SS_OE_XMLDIR /data/app/oracle/product/11.2.0/db_1/demo/schema/order_entry/
DATAPUMP /data/app/datapump
LOG_FILE_DIR /data/app/oracle/product/11.2.0/db_1/demo/schema/log/
MEDIA_DIR /data/app/oracle/product/11.2.0/db_1/demo/schema/product_media/
DATA_FILE_DIR /data/app/oracle/product/11.2.0/db_1/demo/schema/sales_history/
XMLDIR /data/app/oracle/product/11.2.0/db_1/rdbms/xml
ORACLE_OCM_CONFIG_DIR /data/app/oracle/product/11.2.0/db_1/ccr/hosts/dbabd/state
DATA_PUMP_DIR /data/app/oracle/admin/dbabd/dpdump/
ORACLE_OCM_CONFIG_DIR2 /data/app/oracle/product/11.2.0/db_1/ccr/state
10 rows selected
- 授予用户读写目录权限
SYS@dbabd> grant read,write on directory datapump to scott;
Grant succeeded.
SYS@dbabd> grant read,write on directory datapump to hr;
Grant succeeded.
- 授予用户DATAPUMP_EXP_FULL_DATABASE角色和DATAPUMP_IMP_FULL_DATABASE角色权限
为了使scott和hr用户有导出/导入全库的权限,所以授予这两个用户DATAPUMP_EXP_FULL_DATABASE角色和DATAPUMP_IMP_FULL_DATABASE角色权限
SYS@dbabd> grant DATAPUMP_EXP_FULL_DATABASE to scott;
Grant succeeded.
SYS@dbabd> grant DATAPUMP_IMP_FULL_DATABASE to scott;
Grant succeeded.
SYS@dbabd> grant DATAPUMP_EXP_FULL_DATABASE to hr;
Grant succeeded.
SYS@dbabd> grant DATAPUMP_IMP_FULL_DATABASE to hr;
Grant succeeded.
expdp工具
Oracle Data Pump Export(以下简称为export)是数据泵用于将数据和元数据从数据库中导出并存储在操作系统上一组转储文件集的工具(对应操作系统命令为expdp)。导出的转储文件集只能通过数据泵导入工具impdp进行导入,文件集可以在本系统进行导入同时也支持在其他系统上进行导入。文件集包含一个或多个文件,这些文件分别存储了表实际数据、对象元数据和控制信息,文件集存储格式为专有的二进制格式。
由于expdp工具是服务端而非客户端工具,因此DBA必须为导出操作用户指定目录对象来存储转储文件集,目录对象是数据库对象,在操作系统层面对应的文件路径。
工作方式
expdp命令行工具主要有三种工作方式:
- 命令行方式(Command-Line Interface)
通过命令行方式直接为expdp指定相应的参数文件进行导出任务。 - 参数文件方式(Parameter File Interface)
将命令行参数写入参数文件,通过指定参数parfile来指定要读取的参数文件,如果指定参数涉及引号,建议使用参数文件方式。 - 命令交互方式(Interactive-Command Interface)
停止写入日志文件,并显示Export>提示符,可以在提示符当中输入相应的命令。可以在命令行方式和参数文件方式开始之后输入Ctrl+C调用命令交互方式,命令交互方式也可以连接到正在执行或者已停止的任务。
命令说明
通过执行如下命令可以得出expdp主要参数用法说明:
$ expdp help=y
[oracle@dbabd ~]$ expdp help=y
-- USERID在命令行方式当中必须是第一个参数
USERID must be the first parameter on the command line.
The available keywords and their descriptions follow. Default values are listed within square brackets.
-- 指定导出访问数据时使用的特殊方法,默认值AUTOMATIC
'
AUTOMATIC:由数据泵自动选择导出访问数据方式;
DIRECT_PATH:使用直接路径访问方式;
EXTERNAL_TABLE:使用外部表访问方式。
建议使用默认值方式,让数据泵自己选择适合的方式。
限制:
1.如果同时指定了参数NETWORK_LINK,则不支持直接路径访问方式;
2.可传输表空间导出任务不支持参数ACCESS_METHOD。
'
ACCESS_METHOD=[AUTOMATIC | DIRECT_PATH | EXTERNAL_TABLE]
-- 连接到已存在指定名称的导出任务上,如ATTACH=job_name
ATTACH [=[schema_name.]job_name]
-- 针对RAC环境,可以在导出任务中在RAC其他实例中启用工作进程,默认值YES,建议RAC环境导出时指定CLUSTER=NO,不会影响其他实例的性能
CLUSTER=[YES | NO]
-- 指定哪些数据在导出时需要进行压缩,主要有4种选项,默认值METADATA_ONLY
'
ALL:导出所有对象都压缩;
DATA_ONLY:导出的数据压缩;
METADATA_ONLY:导出的元数据压缩,默认选项;
NONE:导出过程不执行压缩。
'
COMPRESSION=[ALL | DATA_ONLY | METADATA_ONLY | NONE]
-- 指定导出内容,主要有3种选项,默认值ALL
'
ALL:导出所有数据和元数据,默认选项;
DATA_ONLY:只导出数据库表行数据,不导出数据库对象定义数据;
METADATA_ONLY:只导出数据库对象定义数据,不导出数据库表行数据。
'
CONTENT=[ALL | DATA_ONLY | METADATA_ONLY]
-- 指定导出文件存储的目录,默认值为DATA_PUMP_DIR目录
'
该目录指的是数据库对象中的一种,而不是操作系统当中的目录;
如果在参数DUMPFILE和LOGFILE当中指定目录则会覆盖DIRECTORY指定的值。
'
DIRECTORY=directory_object
-- 指定导出文件的文件名,也可以加上目录选项,默认值expdat.dmp
'
可以为导出任务指定转储为多个文件,如有多个用逗号进行分隔,如果没有为文件指定扩展名,则默认为.dmp;
文件名也可以使用变量%U,这样意味着将生成多个文件,%U变量是一个2位宽度的递增整数,从01~99;
如果参数FILESIZE有指定值,则导出的每个文件都是指定大小的值并且无法扩展,即使每个文件只包含少量的数据,相当于文件大小是固定的。
限制:
如果导出文件名与先前导出文件名重复,则导出任务不会进行覆盖而中止报错,可以通过参数REUSE_DUMPFILES=YES来覆盖之前同名文件。
'
DUMPFILE=[directory_object:]file_name [, ...]
-- 指定哪些数据在导出时需要进行加密,主要有5种选项,默认值由其他几个加密相关参数共同决定
'
要开启加密,参数ENCRYPTION和ENCRYPTION_PASSWORD必须至少指定一个;
ALL:导出所有对象都加密;
DATA_ONLY:导出的数据加密;
ENCRYPTED_COLUMNS_ONLY:指定只有原先加密字段的导出数据加密,要开启字段加密,则需开启TDE;
METADATA_ONLY:导出的元数据加密;
NONE:导出过程不执行加密。
如果只指定ENCRYPTION_PASSWORD参数的话,ENCRYPTION默认为ALL。
如果只指定ENCRYPTION参数,同时加密wallet开启,则加密模式为TRANSPARENT,如果加密wallet关闭,则报错。
如果参数ENCRYPTION和ENCRYPTION_PASSWORD都没有指定的话,ENCRYPTION为NONE。
'
ENCRYPTION = [ALL | DATA_ONLY | ENCRYPTED_COLUMNS_ONLY | METADATA_ONLY | NONE]
-- 指定导出加密算法,主要有3种选项,默认值为AES128
'
如果有指定该参数,参数ENCRYPTION和ENCRYPTION_PASSWORD必须至少指定一个,否则报错。
'
ENCRYPTION_ALGORITHM = [AES128 | AES192 | AES256]
-- 指定导出的加密模式,主要有3种选项,默认值由其他几个加密相关参数共同决定
'
DUAL:双模加密模式,导出文件加密可以使用透明加密或者是指定加密密码模式,双模模式加密的导出文件适用于当前主机加密wallet开启的导入,同时也适用于未开启加密wallet但指定密码的导入;
PASSWORD:密码模式,要求在导出任务时指定加密文件的加密密码,在加密文件导入时必须指定相同密码,必须同时指定参数ENCRYPTION_PASSWORD,对于异机导入并需要加密的文件来说最适用;
TRANSPARENT:透明加密模式,导出文件的加密无需DBA的干预,需要加密wallet的开启,参数ENCRYPTION_PASSWORD无需指定,相反的指定反而会报错,这种模式适用于导出导入只在当前主机进行并需要对文件进行加密。
限制:
1.如果有指定该参数,参数ENCRYPTION和ENCRYPTION_PASSWORD必须至少指定一个,否则报错;
2.当指定参数ENCRYPTION=ENCRYPTED_COLUMNS_ONLY时,不能使用该参数,否则报错。
'
ENCRYPTION_MODE = [DUAL | PASSWORD | TRANSPARENT]
-- 指定导出的加密密码
'
如果指定了该参数,则参数ENCRYPTION_MODE必须设置成DUAL或PASSWORD。
如果指定了该参数,但没有指定参数ENCRYPTION_MODE,则不需要通过TDE来加密,因为ENCRYPTION_MODE默认为PASSWORD。
如果加密模式为TRANSPARENT,则该参数是无效的。
如果参数ENCRYPTION_MODE=DUAL时,需要使用该参数,则需要开启TDE。
对于网络导出任务,该参数与ENCRYPTION=ENCRYPTED_COLUMNS_ONLY联合使用时不支持用户定义有加密字段的外部表导出,该表在导出时会被忽略,但是导出任务还会继续。
对于导出作为源表,导入的作为目标表并事先已存在,相关字段的加密属性必须完全匹配,否则会报错。
'
ENCRYPTION_PASSWORD = password
-- 指定导出任务对磁盘空间需求的估算方式,估算值输出到日志和标准输出,主要有2种选项,默认值BLOCKS
'
BLOCKS:通过计算导出对象对应的块数量与块大小的乘积进行估算;
STATISTICS:通过每张表的统计信息进行估算。
估算只包含表行数据,而不包含元数据。
限制:
1.当该参数指定为BLOCKS时,对于导出任务指定压缩的表的估算是不准确的,应当指定为STATISTICS;
2.当指定参数QUERY或REMAP_DATA时,估算值是不准确的。
'
ESTIMATE=[BLOCKS | STATISTICS]
-- 指定对导出任务进行磁盘空间进行估算,但不进行导出,默认值NO
'
该参数不能与参数QUERY联合使用。
'
ESTIMATE_ONLY=[YES | NO]
-- 指定导出任务当中需要过滤排除的元数据对象和对象类型
'
object_type指定需要排除的对象类型,可以通过以下三个视图查询哪些是可以排除的对象类型:
1.DB级:DATABASE_EXPORT_OBJECTS
2.SCHEMA级:SCHEMA_EXPORT_OBJECTS
3.TABLE级:TABLE_EXPORT_OBJECTS
如果一个对象被排除,则与之相关联的对象也会被排除,比如排除一张表,表相关的索引和触发器等也会被排除。
name_clause是个可选项,允许在需要排除的对象类型进行选择。它可以使用SQL运算符和表达式来进行选择匹配,与对象类型之间必须用冒号(:)进行隔开并使用双引号("")包围,如EXCLUDE=INDEX:"LIKE 'EMP%'"。
name_clause涉及名称的字符必须全匹配,包括大小写敏感,如果name_clause没有指定,则所有指定类型对象都将被排除。
排除约束:
1.EXCLUDE=CONSTRAINT会排除所有非参考约束,除了NOT NULL约束和一些表重建时必须依赖的约束;
2.EXCLUDE=REF_CONSTRAINT会排除所有参考完整的约束,如外键。
排除权限和用户:
1.EXCLUDE=GRANT会排除对象类型所有对象权限和系统权限;
2.EXCLUDE=USER会排除定义用户的元数据(创建用户的DDL语句),但不会排除用户所在SCHEMA的其他对象。
'
EXCLUDE=object_type[:name_clause] [, ...]
-- 指定导出任务中每个文件的最大值,默认值0(相当于允许最大值16TB),如果没指定单位,默认是字节
'
最小值是默认数据泵块大小的10倍,4KB;
最大值是16TB
'
FILESIZE=integer[B | KB | MB | GB | TB]
-- 指定导出指定SCN时刻的数据,用于闪回查询功能
'
导出任务是以指定SCN时一致性的数据,如果指定参数NETWORK_LINK,则SCN引用的是源数据库的SCN;
'
FLASHBACK_SCN=scn_value
-- 指定导出的时间,这个时间会匹配最为接近的SCN时刻的数据,用于闪回查询功能
'
因为TO_TIMESTAMP必须包含在双引号("")当中,所以如果有使用该参数建议书写在参数文件当中。
'
FLASHBACK_TIME="TO_TIMESTAMP(time-value)"
-- 指定需要导出整个数据库,默认值NO
'
参数FULL=YES表明导出所有数据和元数据,要使用FULL模式导出,必须有DATAPUMP_EXP_FULL_DATABASE角色权限。
限制:
FULL模式导出数据并不包括Oracle自身管理的数据和元数据,还有SYS、ORDSYS和MDSYS的SCHEMA数据;
FULL模式不会导出SYS所有的对象权限。
'
FULL=[YES | NO]
-- 指定打印expdp的帮助信息和简要说明,默认值NO
HELP = [YES | NO]
-- 指定在当前导出模式的任务当中需要包含的元数据对象和对象类型
'
INCLUDE的用法大部分可以参考EXCLUDE参数用法。
'
INCLUDE = object_type[:name_clause] [, ...]
-- 指定导出任务名称,默认值系统生成类似SYS_EXPORT_<mode>_NN格式
'
当后续操作ATTACH参数需要指定连接的任务名称,可以通过DBA_DATAPUMP_JOBS和USER_DATAPUMP_JOBS查询获取。
jobname_string:名称最长为30个字节大小(包含空格),如果有包含空格还必须用单引号('')包围。
'
JOB_NAME=jobname_string
-- 指定导出任务的日志文件名,也可以加上具体路径,默认值export.log
'
directory_object:可以为日志文件另外指定DBA创建的其他目录存储,前提是导出用户需要对目录有写权限。
file_name:可以为日志文件指定名称,默认在参数DIRECTORY指定的目录下创建export.log日志文件。
日志文件总是会被创建的,除非指定了参数NOLOGFILE=YES,并且遇到同名日志文件会进行覆盖。
'
LOGFILE=[directory_object:]file_name
-- 指定通过DBLINK导出源端数据库的数据写入目的端的文件
'
如果源数据库是只读的,则使用DBLINK连接源数据库的用户必须有本地管理的临时表空间作为默认临时表空间,否则导出任务会失败。
如果导出操作是建立在非加密的DBLINK上,则导出的所有数据都将以明文方式保存,即使数据在数据库层面是加密的。
限制:
1.DBLINK导出任务不支持LONG类型的字段;
2.基于DBLINK导出任务两个数据库大版本差不能超过1,如11g与10g、11g与12c。
'
NETWORK_LINK=source_database_link
-- 指定导出任务是否阻止创建日志文件,默认值NO
NOLOGFILE=[YES | NO]
-- 指定导出任务最大并行的活动进程数,默认值1
'
指定的数值应该小于等于导出文件的数量(或者导出文件时使用变量%U),这是因为每个工作进程或者I/O服务进程一次只能独占写入一个文件,如果指定不足的导出文件数会影响并行的效果,导致一部分工作进程等待其他进程写入文件。如果其中某个并行I/O服务进程无法获得写入的文件时,导出任务会停止并报ORA-39095错误。一旦出现导出文件数不足以进行并行导出时,可以通过交互模式的ADD_FILE命令添加导出文件。
如果要在导出任务的过程当中调整并行数可以使用交互模式,降低并行数并不会导致减少工作进程的数量,而是在之后任意给定时间减少工作进程数量。如果导出任务支持并行时,提高并行数可以立刻生效。
如果需要并行导出表或表分区,则必须具有DATAPUMP_EXP_FULL_DATABASE角色权限。
'
PARALLEL=integer
-- 指定导出任务的参数文件
'
与其他导出任务的文件相比,参数文件是被导出客户端使用的,所以不依赖于DIRECTORY指定的目录路径,默认路径为执行导出命令的当前目录下。建议需要使用双引号("")指定值的参数写进参数文件中引用,同时PARFILE不支持写入参数文件。
'
PARFILE=[directory_path]file_name
-- 指定导出任务通过查询子句过滤导出内容
'
query_clause:类似于SQL语句当中的WHERE子句,但也可以是其他SQL子句,比如ORDER BY子句,它可以通过数据排序将导出时的堆表转换为索引组织表。如果SCHEMA和表的名字没有指定,则query_clause作用于所有导出的所有表。当指定表名时,表名与query_clause要以冒号(:)隔开,可以指定多个查询子句,但是每张表只能指定一个查询子句。
如果该参数与NETWORK_LINK一起使用,则在query_clause也需要加上NETWORK_LINK的值,如果没加上,数据泵会认为该对象为本地对象,而非源端对象,例:QUERY=(hr.employees:"WHERE last_name IN(SELECT last_name FROM hr.employees@dblink1)")。
限制:
该参数不能与以下参数共同使用:
1.CONTENT=METADATA_ONLY;
2.ESTIMATE_ONLY;
3.TRANSPORT_TABLESPACES。
如果指定了该参数,数据泵使用外部表进行数据导出,外部表使用的是CREATE TABLE AS SELECT语句,SELECT部分就来自于WHERE子句当中指定的内容,当查询子句中包含需要导出表字段,但该字段名与其它语句中出现无需导出表字段名匹配时,导出字段必须加上别名KU$。
查询子句支持的最大字符串大小为4000字节(包含双引号),实际大小为3998字节。
'
QUERY = [schema.][table_name:] query_clause
-- 指定导出任务时通过remap函数对部分表的字段值进行重映射成新值,通常适用于生产环境向测试环境移动数据的脱敏操作
'
参数使用语法中涉及的选项说明(以语法出现顺序):
1.schema:需要进行remap的表所属schema,默认为导出用户的schema;
2.tablename:需要进行remap的表;
3.column_name:需要进行remap的表字段名,一张表最多可以remap字段数量为10;
4.schema:需要进行remap操作的PL/SQL包所属schema,默认为导出用户的schema;
5.pkg:进行remap操作的PL/SQL包;
6.function:进行remap操作的PL/SQL包中的函数。
'
REMAP_DATA=[schema.]tablename.column_name:[schema.]pkg.function
-- 指定导出任务是否覆盖之前同名的导出文件,默认值NO
REUSE_DUMPFILES=[YES | NO]
-- 指定导出任务导出数据的百分比
'
参数代表的是可以导出指定数据的百分比(数据的子集),但这个样本百分比并非是个准确的值,取值范围从.000001到100,但不包含100。
如果指定了表的SCHEMA,也必须指定一张表,也可以仅指定表而不需要指定SCHEMA。如果表没有指定,则参数作用于整个导出任务。
'
SAMPLE=[[schema_name.]table_name:]sample_percent
-- 指定导出任务是否是基于SCHEMA模式的导出,默认值当前导出用户的SCHEMA,也是数据泵默认的导出模式
'
如果导出用户拥有DATAPUMP_EXP_FULL_DATABASE权限,允许导出其他SCHEMA数据,否则只能导出当前用户的SCHEMA。
在导出数据的同时也会导出有关用户定义信息、相关对象权限授予信息等,在执行导入的时候会自动创建SCHEMA。
'
SCHEMAS=schema_name [, ...]
-- 当导出任务指定参数CLUSTER时,指定通过那个服务名所对应的实例进行导出任务,用于RAC环境
'
当参数CLUSTER=NO时,该参数被忽略。
'
SERVICE_NAME=name
-- 指定导出任务需要导出的对象版本,只适用于多个可用版本同时存在数据库中
SOURCE_EDITION=edition_name
-- 指定导出任务打印详细状态信息的频率,默认值0
'
参数单位是秒,详细信息只输出到标准输出设备,而不输出到日志文件中。
'
STATUS=[integer]
-- 指定导出任务为表导出模式
'
当导出的表是分区表时,在导入的过程中是以一个整体分区表进行导入,可以在导入的过程指定参数PARTITION_OPTIONS=DEPARTITION禁止这种方式。
在指定表名之前也可以指定SCHEMA,如果没指定,默认是当前导出用户的SHCEMA,如果想导出其它SCHEMA当中的表,需要具有DATAPUMP_EXP_FULL_DATABASE角色权限。
可以使用%通配符来匹配表名或者表分区名。
关于表名称的限制:
1.默认存储在数据库中的表名是大写格式的,如果指定表名有大小写相互出现时必须包含在双引号("")之中,并且表名称需完全匹配;
2.表名中不允许出现#符号,如果表名需要包含#,同样需要包含在双引号("")之中。
该参数与参数TRANSPORTABLE=ALWAYS一起使用时,对于指定表导出的是元数据、表分区和子分区,而对于实际表数据可以手动拷贝,如果只是导出表分区的一部分,在导入过程中会变成非分区表。
限制:
1.指定表如果有对象属于其他SCHEMA的不会导出,除非特别指定,如指定表有一个触发器与表在不同的SCHEMA,如果没有特别指定,则表触发器不会导出;
2.表使用的类型并不会在表导出模式被导出,这意味着之后在导入时目标数据库没有相应类型,则表创建失败;
3.表导出模式不支持表别名方式指定表名称;
4.通配符%不支持表是分区表的匹配,除非通配符匹配的是表的分区;
5.参数TABLES指定导出表的表名总长度最大值为4MB;
'
TABLES=[schema_name.]table_name[:partition_name] [, ...]
-- 指定导出模式为tablespace需要导出的表空间
'
如果表的所有任意部分都在指定导出表空间当中,则表的所有内容都会被导出。
有权限的用户导出所有的表,而无权限的用户导出所属SCHEMA的表。
'
TABLESPACES=tablespace_name [, ...]
-- 指定导出任务模式为table(指定参数TABLES)一同使用时是否导出表的元数据、分区数据和子分区数据,默认值NEVER
'
ALWAYS:指定导出任务使用可传输选项,该选项与参数TABLES一起使用时只导出表的元数据、分区信息和子分区信息;
NEVER:指定导出任务使用直接路径或外部表方法导出数据而不使用可传输选项,这是默认值。
如果要在可传输模式下导出整个表空间,则需要使用参数TRANSPORT_TABLESPACES。
如果指定了参数TRANSPORTABLE=ALWAYS导出分区表的一部分时,在导入之后原分区表将变成非分区表。
如果指定了参数TRANSPORTABLE=NEVER或者未指定TRANSPORTABLE,在导入时:
1.指定了参数PARTITION_OPTIONS=DEPARTITION,则原表分区每部分生成非分区表;
2.参数PARTITION_OPTIONS未使用,则原表会被创建成完整的分区表,但只有数据被导入,其他元数据数据则没有导入。
限制:
1.该参数只在导出任务模式为table才生效;
2.使用该参数需要有DATAPUMP_EXP_FULL_DATABASE权限;
3.表空间当中的表、表分区、子分区必须是只读的(read only);
4.指定该参数下的导出任务不导出任何的数据,数据导入要通过表空间对应数据文件的拷贝完成;
5.为了确保该参数可用,要将COMPATIBLE兼容性参数至少设置为11.0.0。
'
TRANSPORTABLE = [ALWAYS | NEVER]
-- 指定导出任务是可传输(transportable)模式时是否进行对可传输对象独立性的检查,默认值NO
'
该参数只针对表空间可传输模式的导出任务有效。
如果参数TRANSPORT_FULL_CHECK=YES,导出任务需要保证在导出可传输集中的对象没有存在依赖于其它非导出的对象,这个检查是双向的。如:一张表在导出可传输集中,而表的索引不在,则导出中止,如果索引在导出可传输集中,而表不在,导出也会中止;
如果参数TRANSPORT_FULL_CHECK=NO,导出任务只检查在导出可传输集中是否有对象依赖于非导出的对象,这个检查是单向的。如:一张表在导出可传输集中,而表的索引不在,则导出可以继续并成功,如果索引在导出可传输集中,而表不在,导出会中止,因为只有索引没有表是没有意义的。
该参数与参数TRANSPORT_TABLESPACES一起使用时也进行其它方面的检查,对于实例层面,检查表(包括表索引)的数据段是否都在导出可传输集当中。
'
TRANSPORT_FULL_CHECK=[YES | NO]
-- 指定导出任务是可传输表空间(transportable-tablespace)模式
'
使用该参数指定导出哪些表空间的元数据,日志文件中记录了可传输集中需要用到的数据文件和包含冲突的对象。
该参数导出指定表空间所有对象的元数据,如果要导出特定表的元数据等,只能通过参数TABLES和参数TRANSPORTABLE=ALWAYS一起使用来实现。
导出可传输集在导入时的数据库版本不能低于导出数据库的版本,只能相同或者高于导出时的版本。
限制:
1.可传输的导出任务不支持重启;
2.可传输的导出任务并行度限制为1;
3.可传输表空间模式需要有DATAPUMP_EXP_FULL_DATABASE权限;
4.可传输模式不支持加密的字段;
5.执行导出任务用户的默认表空间不能包含在导出任务可传输集中;
6.SYS和SYSAUX表空间不支持可传输模式;
7.所有包含在导出可传输集中的表空间必须是只读的;
8.如果参数TRANSPORT_TABLESPACES与参数VERSION一起使用时,则VERSION必须等于大于数据库参数COMPATIBLE指定的值;
9.参数TRANSPORT_TABLESPACES不能与参数QUERY一起使用;
10.可传输表空间导出任务不支持参数ACCESS_METHOD。
'
TRANSPORT_TABLESPACES=tablespace_name [, ...]
-- 指定导出的数据库对象的版本,默认值COMPATIBLE
'
COMPATIBLE:导出元数据版本与数据库兼容性级别一致,这是默认值,数据库兼容性值必须大于等于9.2;
LATEST:导出元数据版本与数据库发行版一致;
version_string:指定数据库发行版,如11.2.0,在11g环境下,该值不能低于9.2。
'
VERSION=[COMPATIBLE | LATEST | version_string]
------------------------------------------------------------------------------
-- 以下是交互模式(interactive-command mode)下的命令,在交互模式下,当前导出任务依然在运行,但日志输出是挂起状态,同时会现Export>提示符。
'
开启交互模式有以下两种方式:
1.通过客户端连接,执行Ctrl+C;
2.通过另一个终端,使用expdp命令与参数ATTACH连接到正在运行的导出任务。
'
The following commands are valid while in interactive mode.
Note: abbreviations are allowed.
-- 为导出任务添加额外导出文件,可以使用变量%U
'
file_name中不能包含任何目录信息,如果没有指定则默认为导出目录,有指定需以冒号(:)隔开。
'
ADD_FILE=[directory_object:]file_name [,...]
-- 从交互模式转换为日志记录模式
'
在日志记录模式下,导出任务状态还是会持续输出到终端,如果当前任务是停止的,CONTINUE_CLIENT也会重新启动任务。
'
Export> CONTINUE_CLIENT
-- 退出导出任务客户端会话,同时退出日志记录模式,但保持当前任务的运行状态
'
因为导出任务还在运行,所以在之后的某个时间可以通过客户端连接任务,为了获取任务的状态信息,可以查询日志文件或者通过视图USER_DATAPUMP_JOBS或动态视图V$SESSION_LONGOPS。
'
Export> EXIT_CLIENT
-- 重新定义之后产生的导出文件大小,默认单位字节
'
可以参考参数FILESIZE的用法。
'
FILESIZE=integer[B | KB | MB | GB | TB]
-- 指供交互模式的命令信息
Export> HELP
-- 断开当前所有的客户端会话并且中止当前的导出任务
'
使用KILL_JOB中止的导出任务不能被重新启动,所有连接到导出任务的客户端会话(包括执行KILL_JOB的会话)都会断开并会收到警告信息,当所有客户端会断开之后,任务的工作进程也跟着停止,master table和导出文件集都会删除,但日志文件不会被删除。
'
Export> KILL_JOB
-- 调整当前导出任务的活动进程数,即调整导出任务的并行度
PARALLEL=integer
REUSE_DUMPFILES
Overwrite destination dump file if it exists [N].
-- 启动当前会话连接的导出任务
'
START_JOB会重新启动当前会话连接的导出任务(导出任务当前无法执行)。START_JOB会使一个未知错误或STOP_JOB中止的导出任务重新启动,并且不会引起数据丢失和数据文件损坏。
'
Export> START_JOB
-- 显示导出任务的状态信息
'
可以参考参数STATUS的用法
'
STATUS[=integer]
-- 立刻停止或有序地停止当前的导出任务
'
如果当运行STOP_JOB之后master table和导出文件集没有被重建,则连接导出之后还可以通过START_JOB重启。
只执行STOP_JOB而不需加任何选项可以进行有序停止当前导出任务,同时会发出待确认的警告信息。有序停止会等待导出任务的工作进程完成当前的工作。
如果需要立刻中止当前导出任务,则使用STOP_JOB=IMMEDIATE,同时会发出待确认的警告信息,所有的连接客户端会话,包括当前执行命令的会话都会断开。当所有会话都断开之后,导出任务会立刻停止,主进程不会等待工作进程完成当前任务,使用STOP_JOB=IMMEDIATE不存在损坏或数据丢失的风险。
'
STOP_JOB[=IMMEDIATE]
导出模式
- 全导出模式
需要导出全部数据库数据。通过指定参数FULL,必须有DATAPUMP_EXP_FULL_DATABASE权限。 - SCHEMA导出模式
需要导出指定SCHEMA的所有数据。默认的导出模式,要导出非导出用户SCHEMA数据必须有DATAPUMP_EXP_FULL_DATABASE权限。 - 表空间模式
需要导出属于表空间的所有数据。 - 表导出模式
需要导出指定的表。 - 可传输表空间模式
需要导出指定表或者指定表空间的元数据信息,便于表或表空间的数据迁移。详见参数TRANSPORTABLE和TRANSPORTABLE_TABLESPACES说明。
用法示例
- 导出整个数据库
$ expdp scott/tiger FULL=YES DIRECTORY=datapump DUMPFILE=full.dmp LOGFILE=full.log JOB_NAME=scott_full
- 导出SCHEMA
$ expdp scott/tiger SCHEMAS=scott DIRECTORY=datapump DUMPFILE=scott.dmp LOGFILE=scott.log JOB_NAME=scott_schema
- 导出表空间
$ expdp scott/tiger DIRECTORY=datapump DUMPFILE=scott_tbs_users.dmp LOGFILE=scott_tbs_users.log JOB_NAME=scott_tbs_users TABLESPACES=users
- 导出表数据(包含表的对象)
$ expdp hr/hr DIRECTORY=datapump DUMPFILE=hr_emp.dmp LOGFILE=hr_emp.log JOB_NAME=hr_emp TABLES=employees
- 只导出表(或多张)数据(不包含其它表对象)
# 命令行方式
$ expdp hr/hr DIRECTORY=datapump DUMPFILE=hr_emp_job.dmp LOGFILE=hr_emp_job.log JOB_NAME=hr_emp_job TABLES=employees,jobs CONTENT=data_only
# PARFILE方式
$ vim hr_exp.par
DIRECTORY=datapump
DUMPFILE=hr_emp_job.dmp
LOGFILE=hr_emp_job.log
JOB_NAME=hr_emp_job
CONTENT=data_only
INCLUDE=TABLE:"IN ('EMPLOYEES', 'JOBS')"
$ expdp hr/hr PARFILE=hr_exp.par
- 只导出表索引(不包含其它对象)
$ expdp hr/hr TABLES=employees DIRECTORY=datapump DUMPFILE=hr_emp.dmp LOGFILE=hr_emp.log JOB_NAME=hr_emp CONTENT=metadata_only INCLUDE=INDEX:\"LIKE \'EMP%\'\"
- 导出表中部分数据
# 单张表
$ expdp hr/hr TABLES=employees CONTENT=data_only DIRECTORY=datapump DUMPFILE=hr_emp.dmp LOGFILE=hr_emp.log JOB_NAME=hr_emp QUERY='"where employee_id > 150"'
# 多张表
$ expdp hr/hr TABLES=employees,scott.emp CONTENT=data_only DIRECTORY=datapump DUMPFILE=hr_emp.dmp LOGFILE=hr_emp.log JOB_NAME=hr_emp QUERY='"where employee_id > 150"','scott.emp:"where empno = 7788"'
- 指定导出为多个文件
# 当需要指定导出多个文件时最好也指定并行导出或限定每个导出文件大小,否则expdp总是写入第一个文件,对于其他文件只是生成大小为默认4k大小的文件,如果指定每个文件最大大小*文件数量不足以存储导出任务数据,则会报错中止,推荐使用替代变量%U。
# 确定文件数,指定并行度
$ expdp hr/hr DIRECTORY=datapump DUMPFILE=hr_full_1.dmp,hr_full_2.dmp PARALLEL=2 LOGFILE=hr_full.log JOB_NAME=hr_full FULL=yes
# 未确定文件数,指定并行度
$ expdp hr/hr DIRECTORY=datapump DUMPFILE=hr_full_%U.dmp PARALLEL=3 LOGFILE=hr_full.log JOB_NAME=hr_full FULL=yes
# 确定文件数,指定文件最大大小(前提总大小足以存储导出数据)
$ expdp hr/hr DIRECTORY=datapump DUMPFILE=hr_full_1.dmp,hr_full_2.dmp FILESIZE=80MB LOGFILE=hr_full.log JOB_NAME=hr_full FULL=yes
# 未确定文件数,指定并行度,指定文件最大大小
$ expdp hr/hr DIRECTORY=datapump DUMPFILE=hr_full_%U.dmp FILESIZE=50MB PARALLEL=2 LOGFILE=hr_full.log JOB_NAME=hr_full FULL=yes
# 未确定文件数,指定文件最大大小
$ expdp hr/hr DIRECTORY=datapump DUMPFILE=hr_full_%U.dmp FILESIZE=50MB LOGFILE=hr_full.log JOB_NAME=hr_full FULL=yes
- 压缩导出文件
$ expdp hr/hr DIRECTORY=datapump DUMPFILE=hr_full.dmp COMPRESSION=all LOGFILE=hr_full.log JOB_NAME=hr_full FULL=yes
- 加密导出文件
# 只指定加密范围(ENCRYPTION),必须开启wallet,否则报错
$ expdp hr/hr DIRECTORY=datapump SCHEMAS=hr DUMPFILE=hr.dmp ENCRYPTION=all LOGFILE=hr.log JOB_NAME=hr
Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
ORA-39002: invalid operation
ORA-39188: unable to encrypt dump file set
ORA-28365: wallet is not open
# 开启wallet
'
1.查询存储wallet文件目录是否创建
SQL@dbabd> select * from v$encryption_wallet;
WRL_TYPE WRL_PARAMETER STATUS
-------------------- ---------------------------------------- ------------------
file /data/app/oracle/admin/dbabd/wallet CLOSED
$ ll /data/app/oracle/admin/dbabd/wallet
ls: cannot access /data/app/oracle/admin/dbabd/wallet: No such file or directory
2.创建目录
$ mkdir -pv /data/app/oracle/admin/dbabd/wallet
mkdir: created directory ‘/data/app/oracle/admin/dbabd/wallet’
3.开启wallet
SYS@dbabd> alter system set encryption key identified by oracle;
System altered.
SQL@dbabd> select * from v$encryption_wallet;
WRL_TYPE WRL_PARAMETER STATUS
-------------------- ---------------------------------------- ------------------
file /data/app/oracle/admin/dbabd/wallet OPEN
$ ls /data/app/oracle/admin/dbabd/wallet
ewallet.p12
'
# 只指定加密密码(ENCRYPTION_PASSWORD),加密范围(ENCRYPTION)默认为ALL
$ expdp hr/hr DIRECTORY=datapump SCHEMAS=hr DUMPFILE=hr.dmp ENCRYPTION_PASSWORD=oracle LOGFILE=hr.log JOB_NAME=hr
# 指定加密范围(ENCRYPTION),同时指定加密密码(ENCRYPTION_PASSWORD),wallet不需要开启
$ expdp hr/hr DIRECTORY=datapump SCHEMAS=hr DUMPFILE=hr.dmp ENCRYPTION=all ENCRYPTION_PASSWORD=oracle LOGFILE=hr.log JOB_NAME=hr
- 预估导出所需空间大小
$ expdp hr/hr SCHEMAS=hr DIRECTORY=datapump ESTIMATE=statistics ESTIMATE_ONLY=yes JOB_NAME=hr
impdp工具
Oracle Data Pump Import(以下简称为import)是数据泵用于将数据和元数据从expdp导出文件集中导入目标数据库的工具(对应操作系统命令为impdp)。
工作方式
与expdp工具相似,impdp命令行工具也有三种工作方式:
- 命令行方式(Command-Line Interface)
通过命令行方式直接为impdp指定相应的参数文件进行导入任务。 - 参数文件方式(Parameter File Interface)
将命令行参数写入参数文件,通过指定参数parfile来指定要读取的参数文件,如果指定参数涉及引号,建议使用参数文件方式。 - 命令交互方式(Interactive-Command Interface)
停止写入日志文件,并显示Ixport>提示符,可以在提示符当中输入相应的命令。可以在命令行方式和参数文件方式开始之后输入Ctrl+C调用命令交互方式,命令交互方式也可以连接到正在执行或者已停止的任务。
命令说明
通过执行如下命令可以得出impdp主要参数用法说明:
$ impdp help=y
因为impdp大部分命令与expdp相同,以下只说明不同的部分:
[oracle@dbabd ~]$ impdp help=y
USERID must be the first parameter on the command line.
The available keywords and their descriptions follow. Default values are listed within square brackets.
-- 指定导入访问数据时使用的特殊方法,默认值AUTOMATIC
'
AUTOMATIC:由数据泵自动选择导出访问数据方式;
DIRECT_PATH:使用直接路径访问方式;
EXTERNAL_TABLE:使用外部表访问方式;
CONVENTIONAL:使用常规访问方式。
建议使用默认值方式,让数据泵自己选择适合的方式。
限制:
1.如果同时指定了参数NETWORK_LINK,则忽略该参数选项;
2.可传输表空间导入任务不支持参数ACCESS_METHOD。
'
ACCESS_METHOD=[AUTOMATIC | DIRECT_PATH | EXTERNAL_TABLE | CONVENTIONAL]
ATTACH
Attach to an existing job.
For example, ATTACH=job_name.
CLUSTER
Utilize cluster resources and distribute workers across the Oracle RAC.
Valid keyword values are: [Y] and N.
CONTENT
Specifies data to load.
Valid keywords are: [ALL], DATA_ONLY and METADATA_ONLY.
-- 指定哪些数据类型在导入过程中需要作相应的特殊处理
'
DISABLE_APPEND_HINT:指定在数据对象导入的时候不使用APPEND hint的功能。如果数据库中已经存在一部分需要导入的数据对象,为了提高应用对这部分数据的并发访问能力,禁用APPEND hint可以收到不错的效果,如果没有指定DISABLE_APPEND_HINT,则默认会使用APPEND hint来导入数据;
SKIP_CONSTRAINT_ERRORS:指定在数据对象导入的时候如果遇到非延迟约束检测冲突时继续进行导入操作。该选项记录哪些行引起了冲突但不会中止导入,如果没有指定SKIP_CONSTRAINT_ERRORS,当遇到非延迟约束冲突时则默认会回滚数据对象导入操作。
限制:
1.如果指定了DISABLE_APPEND_HINT,则导入可能需要更长的时间;
2.如果指定了SKIP_CONSTRAINT_ERRORS,在导入过程中在相对应的数据对象上创建唯一索引或约束条件,则APPEND hint不会作用于对象的导入,所以对于这些对象的导入会花费较多时间;
3.即使指定了SKIP_CONSTRAINT_ERRORS,除非数据对象使用外部表方式导入,否则该选项也不会生效。
'
DATA_OPTIONS = [DISABLE_APPEND_HINT | SKIP_CONSTRAINT_ERRORS]
DIRECTORY
Directory object to be used for dump, log and SQL files.
DUMPFILE
List of dump files to import from [expdat.dmp].
For example, DUMPFILE=scott1.dmp, scott2.dmp, dmpdir:scott3.dmp.
ENCRYPTION_PASSWORD
Password key for accessing encrypted data within a dump file.
Not valid for network import jobs.
ESTIMATE
Calculate job estimates.
Valid keywords are: [BLOCKS] and STATISTICS.
EXCLUDE
Exclude specific object types.
For example, EXCLUDE=SCHEMA:"='HR'".
FLASHBACK_SCN
SCN used to reset session snapshot.
FLASHBACK_TIME
Time used to find the closest corresponding SCN value.
-- 指定需要导入整个数据库(或者从所有导出文件中导入),默认值YES
'
指定该参数需要有DATAPUMP_IMP_FULL_DATABASE角色权限。
'
FULL
Import everything from source [Y].
HELP
Display help messages [N].
INCLUDE
Include specific object types.
For example, INCLUDE=TABLE_DATA.
JOB_NAME
Name of import job to create.
-- 指定导入任务的日志文件名,也可以加上具体路径,默认值import.log
LOGFILE=[directory_object:]file_name
NETWORK_LINK
Name of remote database link to the source system.
NOLOGFILE
Do not write log file [N].
PARALLEL
Change the number of active workers for current job.
PARFILE
Specify parameter file.
-- 指定在导入任务时是否创建表分区,当指定参数TABLES和TRANPORTABLE=ALWAYS进行导入时默认值为departition,否则为none
'
none:指定导入时根据表导出时的方式重建表。当表导出时是可传输模式并过滤了部分表分区或子分区时,不能指定该值,必须使用departition;
departition:指定对于导出时是分区表,导入时每个表分区或子分区创建为独立的新表,表名继承表分区和子分区名称;
merge:指定对于导出时是分区表,导入时合并创建为一张新表。
关于分区表导入并行度的说明:
1.如果是分区表数据导入一张已存在的分区表,则数据泵导入时一次只能处理一个分区或子分区,将会忽略参数PARALLEL指定的值;
2.如果要导入的分区表并不存在,必须通过数据泵导入进行创建,则参数PARALLEL指定值可以提高导入并行度。
限制:
1.如果表导出状态是可传输模式和指定表分区或子分区的导出时,在表导入时必须指定为PARTITION_OPTIONS=departition;
2.如果表导出状态是可传输模式时,则表导入时不能使用PARTITION_OPTIONS=merge;
3.如果导入操作要对已授权表分区对象进行非分区化操作,则会提示错误信息且不会导入对象。
'
PARTITION_OPTIONS=[NONE | DEPARTITION | MERGE]
QUERY
Predicate clause used to import a subset of a table.
For example, QUERY=employees:"WHERE department_id > 10".
REMAP_DATA
Specify a data conversion function.
For example, REMAP_DATA=EMP.EMPNO:REMAPPKG.EMPNO.
-- 指定重映射导出文件中对于语句CREATE TABLESPACE、CREATE LIBRARY和CREATE DIRECTORY语句的数据文件引用对象
'
对于需要在不同操作系统平台转换数据文件路径命名规则时较为适用,在导入的过程中可以进行数据文件的重映射。建议源路径名和目标路径名都用双引号("")包围,最好可以采用参数文件方式,避免不必要的转义符使用。
'
REMAP_DATAFILE=source_datafile:target_datafile
-- 指定重映射导出文件中对象所属的SCHEMA
'
REMAP_SCHEMA可以指定多个,但每一个的source_schema必须不相同,不同的source_schema可以映射到相同的target_schema中。
如果需要重映射的target_schema不存在,则在导入的过程中会创建,前提是在导出文件中包含针对source_schema的CREATE USER元数据信息和创建所需要的权限;
如果导出文件当中没有包含创建SCHEMA所需的元数据信息或者导入用户没有创建的相应权限,则target_schema必须在导入操作之前创建完成;
如果导入操作没有创建SCHEMA,当导入操作完成之后必须为SCHEMA指定一个新的密码进行连接,SQL语句如下:
SQL> ALTER USER schema_name IDENTIFIED BY new_password
限制:
1.不具有权限的用户只能够执行target_schema是本身用户的重映射操作,如SCOTT可以重映射BLAKE对象到SCOTT,但没办法重映射自身对象到BLAKE;
2.如果导入正在重映射的任何表中包含用户定义的对象类型,并在导出和导入之间发生了变化,则该表的导入操作将失败,但是整个导入操作会继续进行;
3.默认情况下,SCHEMA对象在源数据库中都有对象标识符(OID),在导入时会将OID一同导入到目标数据库中。如果导入操作也是在源数据库上进行操作,则会发生OID的冲突导致导入操作失败,解决方式是指定参数TRANFORM=OID:N进行导入,这样会为导入对象创建一个新的OID,允许导入操作成功进行。
'
REMAP_SCHEMA=source_schema:target_schema
-- 指定在导入过程中重命名表名
'
可以使用REMAP_TABLE重命名整张表或者当导入操作将分区表转化为非分区表时进行重命名。
当使用如下第一种书写方式时,假设有REMAP_TABLE=A.B:C,则A是SCHEMA名,B是旧表名,C为新表名,如果需要将表的分区重命名为非分区表,则必须指定SCHEMA名;
当使用如下第二种书写方式时,如果需要将表的分区重命名为非分区表,则只需要对旧表名进行限定,不用指定SCHEMA名。
限制:
1.只有在进行导入操作的表才能进行重命名,已存在的表不支持;
2.如果需要重映射的表在相同SCHEMA中具有命名约束,并且在创建表时需要创建约束,则REMAP_TABLE不生效。
'
REMAP_TABLE=[schema.]old_tablename[.partition]:new_tablename
或
REMAP_TABLE=[schema.]old_tablename[:partition]:new_tablename
-- 指定在导入操作时所有选择的对象及其包含的持久数据重映射在新的表空间中创建
'
REMAP_TABLESPACE可以指定多个,但每一个的source_tablespace必须不相同,并且导入的目标SCHEMA需要在target_tablespace具有合适的表空间配额。
使用REMAP_TABLESPACE是对象在导入操作重映射表空间的唯一方法,适用于几乎所有的对象,包括用户等。
'
REMAP_TABLESPACE=source_tablespace:target_tablespace
-- 指定导入操作任务是否重用已存的数据文件创建表空间,默认值NO
'
如果指定默认值NO并且在CREATE TABLESPACE语句中的数据文件已经存在,则CREATE TABLESPACE将报错,但导入任务会继续。
如果指定值为YES,则已存在的数据文件会被初始化,有可能会导致数据丢失。
'
REUSE_DATAFILES=[YES | NO]
-- 指定导入任务方式为SCHEMA模式导入,当使用基于网络导入模式时,该模式为默认模式
'
如果执行导入操作的用户具有DATAPUMP_IMP_FULL_DATABASE角色权限,则可以通过该参数SCHEMAS指定需要进行该模式导入的SCHEMA列表,首先是用户定义语句(前提是事先并不存在)、系统和角色权限授予、密码历史纪录等等,其次是导入SCHEMA包含的所有对象。如果没有DATAPUMP_IMP_FULL_DATABASE角色权限,则只能导入用户自身的SCHEMA。
'
SCHEMAS=schema_name [,...]
SERVICE_NAME
Name of an active Service and associated resource group to constrain Oracle RAC resources.
-- 指定导入操作是否跳过表中标记为Unusable状态的索引,默认值依据数据库参数SKIP_UNUSABLE_INDEXES指定的值
'
如果该参数的值为YES,则遇到表或者表分区当中的索引是Unusable状态时导入操作依然会进行,就像该索引不存在一样;
如果该参数的值为NO,则遇到表或者表分区当中的索引是Unusable状态时导入操作不会进行,其他表如果之前没有设置Unusable状态的索引依然会进行导入更新;
如果参数未指定,则依据数据参数SKIP_UNUSABLE_INDEXES指定的值(默认为TRUE)来处理;
如果索引被用来强制执行约束但并标记为Unusable状态,则表的数据不会被导入。
此参数只适用于导入目标库中已存在表一部分数据时有用,如果表和索引的创建作为导入操作的一部分,则这个参数没有意义。
'
SKIP_UNUSABLE_INDEXES=[YES | NO]
SOURCE_EDITION
Edition to be used for extracting metadata.
-- 指定将导入操作基于其他参数需要执行的DDL语句写入到文件中
'
file_name指定需要写入SQL DDL语句的文件名,可以额外为其指定目录(前提是用户需要有读写权限),SQL语句实际上并没有执行,连接用户的密码并不存储在该文件中。
限制:
1.如果指定了SQLFILE,参数CONTENT如果指定值为ALL或DATA_ONLY则被忽略;
2.如果导入操作使用到了ASM,则SQLFILE必须写入到磁盘文件,而不是写到ASM中;
3.SQLFILE不能与参数QUERY联合使用。
'
SQLFILE=[directory_object:]file_name
STATUS
Frequency (secs) job status is to be monitored where
the default [0] will show new status when available.
-- 指定是否导入在导出文件中包含的Streams元数据,默认值YES
STREAMS_CONFIGURATION=[YES | NO]
-- 指定导入操作对目标数据库中已存在表如何处理,默认值SKIP(当指定参数CONTENT=DATA_ONLY时,默认值为APPEND)
'
SKIP:让已存在的表保持原样并跳过至下一个对象进行导入,如果指定参数CONTENT=DATA_ONLY,该选项无效;
APPEND:保持已存在的表原有行数据不变,并追加新的行数据;
TRUNCATE:对已存在的表执行TRUNCATE操作后再插入新的行数据;
REPLACE:删除已存在的表然后从导出文件中重新创建表并插入新的行数据,如果指定参数CONTENT=DATA_ONLY,该选项无效。
注意:
1.当指定参数值为TRUNCATE或REPLACE时,需确保受影响表中的行不受参考约束的限制;
2.当指定参数值为SKIP、APPEND或TRUNCATE时,对于源端已存在的表独立对象,如索引、对象授权、触发器和约束都不会被修改。当指定参数值为REPLACE时,如果没有显式或隐式的指定EXCLUDE排除对象,则源端独立对象会被删除并且重建;
3.当指定参数值为APPEND或TRUNCATE时,将会先对源端表数据行与已存在的表数据行是否兼容,然后再执行其它操作:
(1).如果已存在的表存在活动状态的约束和触发器,则导入操作使用外部表访问方式进行,假如行数据与约束冲突,则导入操作失败,数据也不会被导入,可以通过参数DATA_OPTIONS=SKIP_CONSTRAINT_ERRORS跳过检查;
(2).如果表数据是必须被导入,但有可能会引起约束检测冲突,解决方式可以先禁用约束检测,导入完数据并且清除导致冲突的数据再重新启用约束。
4.当指定参数值为APPEND时,导入数据总是会使用新的空间,即使原先有空闲空间也不会被重复使用,所以可能需要在导入完成之后进行数据压缩。
'
TABLE_EXISTS_ACTION=[SKIP | APPEND | TRUNCATE | REPLACE]
TABLES
Identifies a list of tables to import.
For example, TABLES=HR.EMPLOYEES,SH.SALES:SALES_1995.
-- 指定导入任务方式为表空间模式(tablespace-mode)导入
'
该参数指定在导出文件集中(FULL、SCHEMA、TABLESPACE和TABLE的导出模式)或其它源数据库里哪些表空间和表空间下面包含的表以及独立对象会被导入。
以下情况导入操作会自动创建表空间:
1.导入模式是FULL模式或使用可传输表空间模式(TRANSPORT_TABLESPACES);
2.导入模式是表模式,但同时指定了TRANSPORTABLE=ALWAYS。
对于其他模式的导入都需要表空间事先存在,也可以通过参数REMAP_TABLESPACE指定重映射到已存在的表空间。
'
TABLESPACES=tablespace_name [, ...]
-- 可以参考expdp中的SOURCE_EDITION参数说明
TARGET_EDITION
Edition to be used for loading metadata.
-- 指定更改导入对象DDL创建语句
'
transform_name指定需要转换的名称,主要有以下几种:
1.SEGMENT_ATTRIBUTES(段属性):如果指定值为y,则段属性(物理属性、存储属性、表空间和日志记录都包含在内)及适合的DDL语句。默认值为y。
2.STORAGE(存储):如果指定值为y,则包含存储子句及适合的DDL语句。默认值为y。如果选项SEGMENT_ATTRIBUTES=n则忽略该选项的值。
3.OID(对象标识符):如果指定值为n,则在导入时禁止为导出的表和类别对象创建新的OID。导入为对象创建新的OID对于SCHEMA的克隆很有用,但并不会影响参考的对象。默认值为y。
4.PCTSPACE:指定数据文件当中区分配的百分比大小。指定值必须是一个大于0的数值。
5.SEGMENT_CREATION(段创建):如果指定值为y,则SEGMENT CREATION子句会加入到CREATE TABLE语句中,SEGMENT CREATION会以SEGMENT CREATION DEFERRED或SEGMENT CREATION IMMEDIATE的形式存在。如果指定值为n,则在CREATE TABLE省略SEGMENT CREATION子句,使用数据库默认创建段的方式。
value指定转换的取值,根据转换的种类来决定取值,从以上取值可发现,除了PCTSPACE需要为数值时,其它的都是y/n。
object_type指定转换类型,为可选项,如果没指定的话则应用于所有的对象类型。详细可以参考官方文档:
https://docs.oracle.com/cd/E11882_01/server.112/e22490/dp_import.htm#SUTIL939
'
TRANSFORM = transform_name:value[:object_type]
-- 指定导入任务方式为表模式(table-mode)导入是否使用可传输选项导入指定表、表分区和子分区的元数据,默认值NEVER
'
ALWAYS:指定导入任务使用可传输选项,该选项与参数TABLES一起使用时只导入表、表分区和子分区的元数据;
NEVER:指定导入任务使用直接路径或外部表方法导入数据而不使用可传输选项,这是默认值。
其他说明可以参考expdp同名参数说明。
限制:
1.TRANSPORTABLE参数只有与参数NETWORK_LINK一起使用时才生效;
2.TRANSPORTABLE参数只适用于表模式导入任务(表不能被分区或生成子分区);
3.要执行可传输选项的导入任务,用户在源端需要有DATAPUMP_EXP_FULL_DATABASE角色权限,在目标端需要有DATAPUMP_IMP_FULL_DATABASE角色权限;
'
TRANSPORTABLE = [ALWAYS | NEVER]
-- 指定一个或多个数据文件通过可传输表空间模式导入目标数据库,或者在导出期间使用参数TRANSPORTABLE=ALWAYS并使用表模式导入。数据文件必须在目标数据库存在。
'
datafile_name必须以绝对路径的方式提供。
在执行导入任务操作之前,数据文件必须拷贝到目标端操作系统中,同时也可以对数据文件进行重命名操作。
如果已经有存在通过可传输表空间导出的转储文件,则可以通过可传输模式执行导入任务,通过指定转储文件(包含元数据)和指定参数TRANSPORT_DATAFILE来实现。参数TRANSPORT_DATAFILE为导入任务指明从哪里获取实际的数据。
'
TRANSPORT_DATAFILES=datafile_name
-- 指定是否验证通过可传输表空间导出的文件是否被属于其它表空间的对象引用,默认值NO
'
参数说明可以参考expdp同名参数。
该参数只有当与参数NETWORK_LINK一起使用且针对可传输模式的导出(或对指定参数TRANSPORTABLE=ALWAYS的表模式导出)才生效。
'
TRANSPORT_FULL_CHECK=[YES | NO]
-- 指定哪些表空间通过DBLINK进行可传输表空间模式的导入任务
'
该参数是将指定的一个或多个表空间元数据从源端数据库导入到目标数据库。
因为是可传输模式的导入任务,所以在导入过程中数据泵会自动创建表空间,但是必须在执行导入任务之前拷贝相应的数据文件到目标数据库。
因为在进行基于DBLINK的可传输表空间导入任务中指定了参数NETWORK_LINK,所以在数据传输过程当中并没有生成导出文件,因此还必须指定参数TRANSPORT_DATAFILES来确保impdp工具从哪里获取实际的数据,该数据文件在先前已经拷贝成功。
如果之前已经通过可传输表空间模式的导出任务生成了导出文件集,则也可以执行基于导出文件的可传输表空间模式的导入任务,但在这种情况下不再需要指定参数TRANSPORT_TABLESPACES或者NETWORK_LINK,指定了这两个参数反而会报错,只需要指定导出文件集和参数TRANSPORT_DATAFILES即可。
限制:
1.通过可传输表空间模式进行导出导入任务时,目标数据库版本必须不低于源端数据库;
2.该参数只有与参数NETWORK_LINK一起使用才生效;
3.可传输模式不支持加密字段;
4.可传输表空间导入任务不支持参数ACCESS_METHOD。
'
TRANSPORT_TABLESPACES=tablespace_name [, ...]
VERSION
Version of objects to import.
Valid keywords are: [COMPATIBLE], LATEST or any valid database version.
Only valid for NETWORK_LINK and SQLFILE.
------------------------------------------------------------------------------
-- 以下交互模式命令说明与expdp一致
The following commands are valid while in interactive mode.
Note: abbreviations are allowed.
CONTINUE_CLIENT
Return to logging mode. Job will be restarted if idle.
EXIT_CLIENT
Quit client session and leave job running.
HELP
Summarize interactive commands.
KILL_JOB
Detach and delete job.
PARALLEL
Change the number of active workers for current job.
START_JOB
Start or resume current job.
Valid keywords are: SKIP_CURRENT.
STATUS
Frequency (secs) job status is to be monitored where
the default [0] will show new status when available.
STOP_JOB
Orderly shutdown of job execution and exits the client.
Valid keywords are: IMMEDIATE.
导入模式
- 全导入模式
需要导入全部数据库数据。通过指定参数FULL,必须有DATAPUMP_IMP_FULL_DATABASE权限,这是基于文件导入的默认模式。 - SCHEMA导入模式
需要导入指定SCHEMA的所有数据。导入源可以是FULL、表、表空间或SCHEMA模式导出转储文件集或其他数据库,要导入非导入用户SCHEMA数据必须有DATAPUMP_IMP_FULL_DATABASE权限。 - 表空间模式
需要导入属于表空间的所有数据,导入源可以是FULL、表、表空间或SCHEMA模式导出转储文件集或其他数据库。 - 表导入模式
需要导入指定的表,导入源可以是FULL、表、表空间或SCHEMA模式导出转储文件集或其他数据库,如果要导入不属于导入用户SCHEMA的表,则必须有DATAPUMP_IMP_FULL_DATABASE权限。 - 可传输表空间模式
需要导入指定表或者指定表空间的元数据信息,便于表或表空间的数据迁移,必须有DATAPUMP_IMP_FULL_DATABASE权限。详见参数TRANSPORTABLE_TABLESPACES和TRANSPORT_DATAFILES说明。
用法示例
- 数据准备
先使用SYS用户通过expdp执行一次FULL模式的导出:
$ expdp "'/ as sysdba'" FULL=yes DIRECTORY=datapump DUMPFILE=expfull.dmp LOGFILE=expfull.log JOB_NAME=expfull
- 导入整个数据库
$ impdp "'/ as sysdba'" FULL=yes DIRECTORY=datapump DUMPFILE=expfull.dmp LOGFILE=impfull.log JOB_NAME=impfull
- 导入SCHEMA
# 先查询原先数据库SCOTT用户SCHEMA对象信息
SQL@dbabd> select owner,object_name,object_type from all_objects where owner = 'SCOTT';
OWNER OBJECT_NAME OBJECT_TYPE
------------------------------ ------------------------------ -------------------
SCOTT PK_DEPT INDEX
SCOTT DEPT TABLE
SCOTT EMP TABLE
SCOTT PK_EMP INDEX
SCOTT BONUS TABLE
SCOTT SALGRADE TABLE
6 rows selected
# 删除SCOTT用户及所有SCHEMA对象
SQL@dbabd> drop user scott cascade;
User dropped
SYS@dbabd> select owner,object_name,object_type from all_objects where owner = 'SCOTT';
no rows selected
SYS@dbabd> select * from all_users where username = 'SCOTT';
no rows selected
# 执行SCHEMA模式导入SCOTT
$ impdp "'/ as sysdba'" SCHEMAS=scott DIRECTORY=datapump DUMPFILE=expfull.dmp LOGFILE=imp_scott.log JOB_NAME=imp_scott
# 查询验证
SQL@dbabd> select owner,object_name,object_type from all_objects where owner = 'SCOTT';
OWNER OBJECT_NAME OBJECT_TYPE
------------------------------ ------------------------------ -------------------
SCOTT SALGRADE TABLE
SCOTT BONUS TABLE
SCOTT EMP TABLE
SCOTT DEPT TABLE
SCOTT PK_DEPT INDEX
SCOTT PK_EMP INDEX
6 rows selected
- 导入表数据(包含表的对象)
# 以scott.emp表为例
:'
1.表行数
SYS@dbabd> select count(*) from scott.emp;
COUNT(*)
----------
14
2.表索引
SQL@dbabd> select owner,index_name,table_owner,table_name from dba_indexes where table_name = 'EMP';
OWNER INDEX_NAME TABLE_OWNER TABLE_NAME
-------------------- -------------------- -------------------- --------------------
SCOTT PK_EMP SCOTT EMP
3.表约束
SQL@dbabd> select owner,constraint_name,table_name from dba_constraints where table_name = 'EMP';
OWNER CONSTRAINT_NAME TABLE_NAME
-------------------- ------------------------------ ------------------------------
SCOTT FK_DEPTNO EMP
'
# 删除表scott.emp
SQL@dbabd> drop table scott.emp purge;
Table dropped
# 执行表scott.emp的导入
$ impdp "'/ as sysdba'" TABLES=scott.emp DIRECTORY=datapump DUMPFILE=expfull.dmp LOGFILE=imp_scott.emp.log JOB_NAME=imp_scott.emp
# 查询验证
SQL@dbabd> select count(*) from scott.emp;
COUNT(*)
----------
14
- 只导入表数据(不包含其它表对象)
# 先导入表创建元数据
$ impdp "'/ as sysdba'" TABLES=scott.emp DIRECTORY=datapump DUMPFILE=expfull.dmp LOGFILE=imp_scott.emp.log JOB_NAME=imp_scott.emp CONTENT=metadata_only EXCLUDE=index,constraint,statistics
# 验证表是创建成功
SYS@dbabd> select * from scott.emp;
no rows selected
SYS@dbabd> select owner,index_name,table_owner,table_name from dba_indexes where table_name = 'EMP';
no rows selected
SYS@dbabd> select owner,constraint_name,table_name from dba_constraints where table_name = 'EMP';
no rows selected
# 再导入表数据
$ impdp "'/ as sysdba'" TABLES=scott.emp DIRECTORY=datapump DUMPFILE=expfull.dmp LOGFILE=imp_scott.emp.log JOB_NAME=imp_scott.emp CONTENT=data_only
# 最后验证表数据
SYS@dbabd> select count(*) from scott.emp;
COUNT(*)
----------
14
- 导入转换分区表为非分区表
# 以sh.sales表为例
SQL@dbabd> select table_owner,table_name,partition_name from dba_tab_partitions where table_owner = 'SH' and table_name = 'SALES';
TABLE_OWNER TABLE_NAME PARTITION_NAME
------------------------------ ------------------------------ ------------------------------
SH SALES SALES_1995
SH SALES SALES_1996
SH SALES SALES_H1_1997
SH SALES SALES_H2_1997
SH SALES SALES_Q1_1998
SH SALES SALES_Q1_1999
SH SALES SALES_Q1_2000
SH SALES SALES_Q1_2001
SH SALES SALES_Q1_2002
SH SALES SALES_Q1_2003
SH SALES SALES_Q2_1998
SH SALES SALES_Q2_1999
SH SALES SALES_Q2_2000
SH SALES SALES_Q2_2001
SH SALES SALES_Q2_2002
SH SALES SALES_Q2_2003
SH SALES SALES_Q3_1998
SH SALES SALES_Q3_1999
SH SALES SALES_Q3_2000
SH SALES SALES_Q3_2001
SH SALES SALES_Q3_2002
SH SALES SALES_Q3_2003
SH SALES SALES_Q4_1998
SH SALES SALES_Q4_1999
SH SALES SALES_Q4_2000
SH SALES SALES_Q4_2001
SH SALES SALES_Q4_2002
SH SALES SALES_Q4_2003
28 rows selected
SQL@dbabd> select count(*) from sh.sales;
COUNT(*)
----------
918843
SQL@dbabd> select owner,index_name,table_owner,table_name from dba_indexes where table_name = 'SALES';
OWNER INDEX_NAME TABLE_OWNER TABLE_NAME
--------------- ---------------------- --------------- ---------------
SH SALES_PROD_BIX SH SALES
SH SALES_CUST_BIX SH SALES
SH SALES_CHANNEL_BIX SH SALES
SH SALES_PROMO_BIX SH SALES
SH SALES_TIME_BIX SH SALES
SQL@dbabd> select owner,constraint_name,table_name from dba_constraints where table_name = 'SALES';
OWNER CONSTRAINT_NAME TABLE_NAME
---------------- ------------------------------ ------------------------------
SH SYS_C0011124 SALES
SH SYS_C0011123 SALES
SH SYS_C0011122 SALES
SH SYS_C0011121 SALES
SH SYS_C0011120 SALES
SH SYS_C0011119 SALES
SH SYS_C0011118 SALES
SH SALES_PROMO_FK SALES
SH SALES_CHANNEL_FK SALES
SH SALES_TIME_FK SALES
SH SALES_PRODUCT_FK SALES
SH SALES_CUSTOMER_FK SALES
12 rows selected
# 导入到SCOTT下并重命名为sales_imp,忽略相关的外键约束
$ impdp "'/ as sysdba'" TABLES=sh.sales DIRECTORY=datapump DUMPFILE=expfull.dmp LOGFILE=scott_sales_imp.log JOB_NAME=scott_sales_imp REMAP_SCHEMA=sh:scott REMAP_TABLE=sales:sales_imp PARTITION_OPTIONS=merge EXCLUDE=constraint,statistics
# 查询验证
SQL@dbabd> select count(*) from scott.sales_imp;
COUNT(*)
----------
918843
SQL@dbabd> select owner,index_name,table_owner,table_name from dba_indexes where table_name = 'SALES_IMP';
OWNER INDEX_NAME TABLE_OWNER TABLE_NAME
--------------- ---------------------- --------------- ---------------
SCOTT SALES_PROD_BIX SCOTT SALES_IMP
SCOTT SALES_CUST_BIX SCOTT SALES_IMP
SCOTT SALES_CHANNEL_BIX SCOTT SALES_IMP
SCOTT SALES_PROMO_BIX SCOTT SALES_IMP
SCOTT SALES_TIME_BIX SCOTT SALES_IMP
SQL@dbabd> select owner,constraint_name,table_name from dba_constraints where table_name = 'SALES_IMP';
OWNER CONSTRAINT_NAME TABLE_NAME
---------------- ----------------------------- ------------------------------
SCOTT SYS_C0012351 SALES_IMP
SCOTT SYS_C0012350 SALES_IMP
SCOTT SYS_C0012349 SALES_IMP
SCOTT SYS_C0012348 SALES_IMP
SCOTT SYS_C0012347 SALES_IMP
SCOTT SYS_C0012346 SALES_IMP
SCOTT SYS_C0012345 SALES_IMP
7 rows selected
- 导入表空间
# 创建一个表空间USERS_IMP
SQL@dbabd> create tablespace users_imp datafile '/data/app/oracle/data/dbabd/users_imp.dbf' size 50M;
Tablespace created
SQL@dbabd> select tablespace_name,file_name from dba_data_files;
TABLESPACE_NAME FILE_NAME
------------------------------ --------------------------------------------------
USERS /data/app/oracle/data/dbabd/users01.dbf
UNDOTBS1 /data/app/oracle/data/dbabd/undotbs01.dbf
SYSAUX /data/app/oracle/data/dbabd/sysaux01.dbf
SYSTEM /data/app/oracle/data/dbabd/system01.dbf
EXAMPLE /data/app/oracle/data/dbabd/example01.dbf
USERS_IMP /data/app/oracle/data/dbabd/users_imp.dbf
6 rows selected
# 表空间USERS_IMP添加表
SQL@dbabd> create table scott.table_imp as select * from all_objects;
Table created
SQL@dbabd> select count(*) from scott.table_imp;
COUNT(*)
----------
85005
SQL@dbabd> alter table scott.table_imp move tablespace users_imp;
Table altered
SQL@dbabd> select table_name,tablespace_name from dba_tables where owner = 'SCOTT';
TABLE_NAME TABLESPACE_NAME
------------------------------ ------------------------------
SALGRADE USERS
BONUS USERS
DEPT USERS
EMP USERS
TABLE_IMP USERS_IMP
# 基于USERS_IMP表空间模式导出
$ expdp "'/ as sysdba'" TABLESPACES=users_imp DIRECTORY=datapump DUMPFILE=users_imp.dmp LOGFILE=users_imp.log JOB_NAME=users_imp
# 删除USERS_IMP表空间
SQL@dbabd> drop tablespace users_imp including contents and datafiles;
Tablespace dropped
SYS@dbabd> select count(*) from scott.table_imp;
select count(*) from scott.table_imp
*
ERROR at line 1:
ORA-00942: table or view does not exist
# 导入USERS_IMP表空间
:'
参考impdp参数TABLESPACES的用法,该方式需提前创建USERS_IMP表空间。
'
SQL@dbabd> create tablespace users_imp datafile '/data/app/oracle/data/dbabd/users_imp.dbf' size 20M;
Tablespace created
$ impdp "'/ as sysdba'" TABLESPACES=users_imp DIRECTORY=datapump DUMPFILE=users_imp.dmp LOGFILE=users_imp.log JOB_NAME=users_imp
# 查询验证
SQL@dbabd> select count(*) from scott.table_imp;
COUNT(*)
----------
85005
SQL@dbabd> select table_name,tablespace_name from dba_tables where owner = 'SCOTT';
TABLE_NAME TABLESPACE_NAME
------------------------------ ------------------------------
SALGRADE USERS
BONUS USERS
DEPT USERS
EMP USERS
TABLE_IMP USERS_IMP
总结
以上对Oracle Data Pump(数据泵)命令行工具expdp和impdp主要参数选项进行解析说明,同时也列举了部分常见的使用方式。数据泵工具对于不同系统平台的数据迁移是十强大的工具,在数据量较小的情况效率很高,除此之外也可以作为数据库逻辑备份的主要工具。当然,本文没有对工具中可传输(transportable)部分进行演示,只是进行参数的说明,这个留待以后再进一步总结。