[Data Pump]Learning Data Pump Step by Step (1) Overview of Data Pump

首先来看几个简单的FQA,对Data Pump有个大概的了解,

(1) Data Pump 在哪个版本被引入的 ?

        Oracle 10g 引入了Data Pump 技术, 包含两个utilities: Data Pump Export (expdp), Data Pump Import (impdp), 用来取代之前版本的emp 和 imp。

 (2) Data Pump 主要作用是啥?  

        Data Pump 用来非常高速地(very high speed) 进行 数据库的数据(data)和 元数据 (metadata)在不同数据库之间的迁移, 也就是所谓的data unloading 和 data loading。

        相比较之前的export 和 import来说, data pump对数据的load/unload更加高效。

(3) expdp/impdp 和 exp/imp用起来用啥不同?

       两者在使用起来几乎差不多(参数),但是有一点要注意的是exp/imp都是在client端进行的,dump文件保存在client端, 而expdp/impdp却是在server端进行的,生成的dump 文件是保存在server端的,因此需要首先创建directory对象,并给进行expdp/impdp操作的相关user赋予对改directory的读写操作权限。 

 ------------------------------------------------------------------------------------------------------------

 1. Data Pump的组成

 

Data Pump 主要包含以下3个部分:

 (1) 客户端的命令行工具, expdp impdp

  (2)   Data Pump API, 也就是 DBMS_DATAPUMP  package

 (3) Meatadata API, 也就是DBMS_METADATA package

expdp 和 impdp 通过调用DBMS_DATAPUMP中的相关procedure来完成数据的unload/load。

当进行数据的迁移的时候,Data Pump会自动选择direct path load/unload 或者通过external tables的方式, 或者是两者都会采用。

如果进行元数据(metatdata)的迁移,Data Pump会用到DBMS_METADATA提供的功能。


需要注意一点的是, DBMS_DATAPUMP 和 DBMS_METADATA 可以独立地实用,不需要必须通过expdp/impdp来调用。

 2. Data Pump Export / Import的 New Feature (Oracle 10g)

尽管expdp和impdp看起来和用起来跟之前的exp/imp差不多,但是他们是完全不同的。Data Pump对应的dump files 跟 exp/imp产生的dump files是不兼容的。

以下是data dump提供的新feature,

(1) Data Pump可以多个线程并行执行,因此效率更高。通过设置参数PARALLEL来实现并行处理,需要注意的是这个feature只在enterprise版本的数据库中存在。(PARALLEL)

(2) Data Pump job可以重新启动(START_JOB)。因为data pump其实是通过创建oracle job在Server端执行的,因此如果在data pump unload/load过程中出现问题,可以通过restart这个job来继续数据的unload/load

(3) Data Pump utilities (expdp/impdp) 可以动态attach/detach对应的Job而不影相Job的运行。这样带来的好处是DBA可以在不同的client端来监测job的运行情况。一个Data Pump Export / Import utility 只可以attach到一个Job上,反过来一个Job可以被多个Data Pump Export / Import utility来attach. (ATTACH)

(4) 支持通过network (NETWORK_LINK)来进行export和import操作。

(5)在import的时候可以通过REMAP_DATAFILE来改变数据文件的名字。

(6)在import的时候可以通过REMAP_TABLESPACE讲数据导入到不同的表空间。

(7)在import和export的时候支持过滤metadata。(INCLUDE / EXCLUDE

(8)在Import和Export的时候支持交互性的命令行。(Interactive-Command Mode)

(9)可以估计export的dump file占多大空间,而不需要实际去运行export操作。(ESTIMATE_ONLY)

(10) 支持在不同版本数据库的数据的导入和到处。(VERSION

(11)大多数的Data Pump Export/Import操作是在Server端完成的,有别于之前的exp/imp。

需要注意的是,为了能够make full use of Data Pump, 需要拥有EXP_FULL_DATABAE/IMP_FULL_DATABASE的角色(role).

 3. Data Pump如何访问数据

 

 Data Pump支持两种方式访问数据 (load/unload): direct path和external tables。 这两种方式导出的数据是兼容的,也就是说direct path unload 的数据,可以用external tables方式导入,反之依然。这是因为两种方式支持相同的external data representation。Data Pump会自动选择最快的方法来进行数据的导入和导出。

【Note】Data Pump不会load那些unique indexes被disable的表的。如果该表的数据需要被load,那么被disable的索引要么需要drop掉或者enable.

(1) Direct Path load and unload

Data Pump缺省会用direct path方式来load/unload数据。需要注意的是,当表中含有LONG类型的列时,必须用direct path方式, external table在这种情况下不work。

下面介绍下哪些情况下不能用direct path load

 - 当load一个分区表的一个分区时,而且该分区表上由一个global的索引。

 - LOB 列上有domain index.

 - 表属于一个cluster.

 - Pre-existing table上有活动的触发器。(There is an active trigger on a pre-existing table.)

 - pre-existing table 在insert 模式上enable了fine-grained access control. ( Fine-grained access control is enabled in insert mode on a pre-existing table.)

 - 表上含有BFILE列,或者opaque types的列。

 - A referential integrity contraint is present on a pre-existing table.

 - A table contains VARRAY columns with an embedded opaque type.

 - 表上含有加密的列。

 - The table into which data is being imported is a pre-existing table and at least oneof the following conditions exists:
       There is an active trigger
       The table is partitioned
       fgac is in insert mode
       A referential integrity constraint exists
       A unique index exists

 - Supplemental logging is enabled and the table has at least 1 LOB column.

下面介绍下哪些情况下不能用direct path Unload

 - Fine-grained access control for SELECT is enabled.

 - The table is a queue table.

 -  表上有加密的列。

 -  A column of an evolved type that needs upgrading.

 -  A column of type LONG or LONG RAW that is not last.

 -  The table contains one or more columns of type BFILE or opaque, or an object type contraining opaque columns.

 (2) External Tables.

 Data Pump 提供了一个访问外不表的访问驱动ORACLE_DATAPUMP来进行读写文件。文件的格式和用direct path方式写出的文件一样。

 Data Pump在下列情况下用external table方式来访问数据,

 - Loading and unloading very large tables and partitions in situations where parallel SQL can be used to advantage

 - Loading tables with global or domain indexes defined on them, including partitioned object tables.

 - Loading tables with active triggers or clustered tables.

 - Loading and unloading tables with encrypted columns.

 - Loading tables with fine-grained access control enabled for inserts.

 - Loading tables that are partitioned differently at load time and unload time.

【Note】需要注意的是,虽然Data Pump通过external tables 方式 (ORACLE_DATAPUMP access driver)来产生dump file, 但是该dump file与手动方式(CREATE TABLE ... ORGANIZATION EXTERNAL)生成的文件是不兼容的。因为手动产生的文件只包含数据,没有metadata, 而Data Pump生成的dump 文件既包含data也包含metadata.

 4. 通过database link访问数据

当通过database link来导出数据(export)时, source数据库的数据是写到目标数据库(connected database)上的。另外, source database可以是只读数据库。

当通过database link来导入数据(import)时, import source是数据库,而不是dump file set, 并且数据直接被导入到connected 数据库中。

注意这里得database link跟network link是相通的。

5. 运行Data Pump Job的时候都放生了什么?

一个Data Pump Job涉及到一个master table, 一个master process 和若干个work process.

(1) 任务的协调(Coordination of a Job)

 对于每个Data Pump Export/Import Job,都会创建一个master process. 这个master process充当了协调者的作用,它控制着整个job, 包括与client端交互,创建work process, 写log操作,等等。

(2) 跟踪任务的进度 (Tracking Progresses within a Job)

当数据和元数据(data/metedata)在传输的时候,master table用来记录跟踪job的进度情况。master table其实就是一个创建在数据库中的一个用户表。它的主要作用如下:

- 对于Export操作,master table记录了dump file set内部数据库对象的位置。在export job结束前,master table的内容也会被写到dump file set中。

- 对于Import操作,master table会从dump file set中读出,用来控制数据导入的整个过程(数据对象导入的先后顺序)


master table 在执行export/import 操作的当前user的schema中创建,因此该用户需要有足够的表空间配额来创建这个master table. master table 的名字跟data pump job的名字一样,因此不能给data pump job取一个跟当前用户中数据库对象一样的名字。 


对于所有的操作, master table中的信息可以用来重启下job. master table可以被drop,也可以被保留,取决下如下条件:

- Job成功执行完,master table会被drop.

- 如果job被停掉了(在交互模式下,通过STOP_JOB命令),master table会被保留用来重启job.

- 如果Job是用KILL_JOB来杀掉的话,master table会被drop,job不可以重启。

- 如果job意外终止了,master table会被保留。可以手动删除这个master table,如果不想重启job.

- 如果job在运行前就停止了(在创建阶段), master table会被drop掉。 


(3) 过滤data和metadata (Filtering Data and Metadata During a Job.)

在master table里面,每个数据库对象都被赋予一些属性,像name, owning schema等。

可以通过EXCLUDE, INCLUDE来限制被导入或导出的对象类型(TABLE, INDEX, or DIRECTORY)。 

(4) 转换metadata (Transforming Metadata During a Job)

 在Data Pump Import中,可以通过设置参数REMAP_DATAFILE, REMAP_SCHEMA, REMAP_TABLESPACE, TRANSFORM来进行metadata的相关转换。

(5) 最大化Job的性能 (Maximizing Job Performance)

 可以通过设置PARALLEL参数来提升Job的性能。(Master process创建多个work process并行工作)

(6) 导入/导出数据 (Loading and Unloading of Data)

当一个work process被分配完成load/unload一个很大的表(或分区)的时候,它可以选择用external tables的方式来充分利用并行处理(parallel execution). 在这种情况下,work process就变成了并行执行的协调者,实际的unload/load工作被多个并行的I/O execution processes (slaves)来完成。 这些I/O execution processes 是从instance-wide的并行I/O执行进程池中分配的。

6. 监测data pump job的状态

 Data Pump Import / Export Utilities可以在interactive-command mode或者logging mode关联到(attach)到一个data pump job上。

在logging模式下,关于job运行的状态信息会实时地显示出来。 在interactive-command 模式下,job运行的状态信息可以在查询(request)的时候才显示出来。

在job执行的过程中也可以写log文件,这个文件记录了job的进度情况,过程中遇到的错误信息,以及job完成状态信息。

此外,可以通过查询一些视图来得到job的状态信息,像DBA_DATAPUMP_JOBS, USER_DATAPUMP_JOBS, DBA_DATAPUMP_SESSIONS.


监测Job的进度

Data Pump export /import 表数据操作会在动态视图V$SESSION_LONGOPS中维护一条记录来显示export/import操作的进度。

这个视图中跟Data Pump job相关的列如下:

- USERNAME ( job owner)

- OPNAME (job name)

- TARGET_DESC (job operation)

- SOFAR (megabytes transferred thus far during the job)

- TOTALWORK (estimated number of MB in the job)

- UNITS (MB)
- MESSAGE ( a formatted status message of the form: '<job_name>: <operation_name>: nnn out of mmm MB done'

7. 文件分配(File Allocation)

 Data Pump JObs管理3种文件:

(1)Dump files, 包含data和metadata.

(2)Log files, 记录了export/import过程中的信息 

(3)SQL files, 记录SQLFILE操作的输出。Data Pump Import 通过设置SQLFILE参数来触发SQLFILE操作,产生的结果是一系列的SQL DLL,被保存在sql 文件中。

指定文件和增加dump文件

对于export操作来说,可以在创建Job的时候指定dump files, 也可以迟一些指定,比如说在export过程中,磁盘空间不够了,这个时候可以通过ADD_FILE命令来增加dump文件。

而对于import操作来说,所有的dump文件必须在job创建的时候指定。

Log文件和SQL文件可以被覆写,而Dump文件不可以。

Dump, Log 和 SQL文件的默认路径:

因为Data Pump是基于Server端的,因此dump, log 和SQl文件是存放于server端,需要指定directory对象。可以通过如下命令创建directory:

SQL> CREATE DIRECTORY dpdump_dir1 AS'/usr/apps/datafiles';

在directory创建之后,需要赋给进行data pump操作用户对该目录对象的读写操作权限。比如说,为了让Oracle数据库可以以hr身份来进行文件的读写,DBA需要执行如下操作,

SQL> GRANT READ, WRITE ON DIRECTORY dpdump_dir1 TO hr;

  

在UNIX和Windows系统上,一个默认的directory对象在数据库创建的时候就被创建了(DATA_DUMP_DIR), 该目录只对privileged users开放,因此如果当前user不是privileged user, 需要DBA赋予相应的权限。

可以用下面的SQL语句查看该目录指向的路径,

SQL> SELECT directory_name, directory_path FROM dba_directories 
2 WHERE directory_name = 'DATA_PUMP_DIR';

设置Parallelism

并行度的设置不要超过dump file set中的dump文件数,否则会影响性能。因为多个线程可能会同时访问同一个dump file. 

注意PARALLEL只有企业版的数据库才支持。

使用替代变量(Substitution Variables) 

除了显示地给每个dump file命名,可以用替代变量(%U)来命名dump file,这样就不需要手动设置dump file的名字了。%U从01开始, 一次往下02, 03,...

如果一个dump file的大小达到FILESIZE设置的值,一个新的dump file会自动生成。 

8. 在不同版本的数据库中迁移数据 (Moving Data Between Different Database Versions)

 

(1) 如果设置数据库的版本比当前的数据库版本低,有些feature可能用不了。比如说,设置VERSION=10.1, data compression 就不能设置了,因为10.1不支持data compression.

(2) 在export的时候,如果设置的数据库版本低于当前的数据库版本,则生成的dump file set可以被导入到低版本的数据库中。 但是,dump file set不会包含低版本的数据库不支持的数据库对象。 举例来说,如果你从10.2导入到10.1, 索引类型的说明就不会包含在dump file set中。

(3) Data Pump Import总是可以识别来自低版本数据库的dump file set.

(4) Data Pump Import识别不了来自比当前数据库版本高的数据库的导出dump file set, 除非该导出dump file在导出的时候设置了兼容的VERSION参数。

(5) 当通过network link来导入数据时,Data Pump要求远程数据库的版本不能高于本地数据库版本号。比如说,本地的数据库版本是10.1,则远程数据库版本号要么是10.1或者是10.2. 如果本地的数据库是10.1的,则远程的数据库必须也是10.1的。

 

9. Exp/Imp VS. Expdp/Impdp

 (1) Data Pump Export/ Import作用于一组文件(dump file set), 而不是单一dump file.

(2)Data Pump Export / Import 访问的dump file位于server上而不是在client端。

(3)Data Pump Export / Import 可以并行(parallel)执行。

(4)Data Pump Export / Import 以XML形式存储metadata, 而不是SQL DLL.

(5)Data Pump Export / Import可以自我调节参数。比如说不需要像Exp/Imp那样需要手动设置BUFFER, RECORDLENGTH 等等。

(6)顺序访问的存储介质(sequential media), 像磁带和pipe,是不支持的。

(7)用以前的exp/imp来进行不同版本的数据库之间数据导出导入(从高版本的数据库导出到低版本的数据库),需要用低版本的exp来导高版本的数据库中的数据,因为这样产生的dump 文件才能被低版本的数据库(imp)识别。(i.e. With original Export, you had to run an older version of Export (exp)  to produce a dump file that was compatible with an older database version)

       用Data Pump就不需要这么麻烦,完全可以用高版本的data pump export (expdp)来导出数据,只需要设置参数VERSION为目标数据库的版本号即可。(With Data Pump, you cn use the current Export (expdp) version and simply use the VERSION parameter to specify the target database version.)

(8)Data Pump Export / Import 比之前的Export / Import消耗更多的UNDO表空间。 这是因为需要在Export的时候需要查询metadata, 在import的时候需要访问master table. 因此有可能会遇到ORA-01555, 可以增加UNDO 表空间或者增大参数UNDO_RETENTION的值。

(9)如果表是compression enabled,Data Pump Import会尝试压缩导入的数据。而imp不会这么做。

(10)Data Pump支持字符集的转换(both direct path 和 external tables). 但是当涉及到transportable tablespace的时候,Data Pump不支持字符集的转换。

   

 


原文地址:https://www.cnblogs.com/fangwenyu/p/1674665.html