共计 37716 个字符,预计需要花费 95 分钟才能阅读完成。
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) 部分进行演示,只是进行参数的说明,这个留待以后再进一步总结。
参考
https://docs.oracle.com/cd/E11882_01/server.112/e22490/dp_overview.htm#SUTIL801
https://docs.oracle.com/cd/E11882_01/server.112/e22490/dp_export.htm#SUTIL200
https://docs.oracle.com/cd/E11882_01/server.112/e22490/dp_import.htm#SUTIL300
: