Data Pump(數據抽取)介紹


從10g開始,Oracle提供更高效的Data Pump(即expdp/impdp)來進行數據的導入和導出,老的exp/imp還可以用,但已經不建議使用。注意:expdp/impdp和exp/imp之間互不兼容,也就是說exp導出的文件只能用imp導入,expdp導出的文件只能用impdp導入。

 

Data Pump的組成部分

 
Data Pump有以下三個部分組成:
  1. 客戶端工具:expdp/impdp 
  2. Data Pump API (即DBMS_DATAPUMP)
  3. Metadata API(即DMBS_METADATA)
通常情況下,我們都把expdp/impdp等同於Data Pump,但從上面可以知道,實際上它只是Data Pump的一個組成部分,其實真正干活的是兩個API,只是它們隱藏在后台,平時很少被注意,但如果出現一些莫名其妙的錯誤(如internal error等),通常是因為這兩個API損壞,跑腳本重新編譯它們即可。
 

Data Pump相關的角色

 
默認情況下,用戶可以導出/導入自己schema下的數據,但如果要導出/導入其它schema下的數據,必須要把以下兩個角色賦予該用戶:
  • DATAPUMP_EXP_FULL_DATABASE 
  • DATAPUMP_IMP_FULL_DATABASE
當然,sys,system賬戶和dba角色默認擁有以上兩個角色。
 

Data Pump數據導入方法

  1. 數據文件拷貝:這種是最快的方法,dumpfile里只包含元數據,在操作系統層面拷貝數據文件,相關參數有:TRANSPORT_TABLESPACES,TRANSPORTABLE=ALWAYS 
  2. 直接路徑加載:這是除了文件拷貝之外最快的方法,除非無法用(比如BFILE),否則都用這種方法
  3. 外部表:第1,2種無法用的情況下,才會使用外部表
  4. 傳統路徑加載:只有在以上所有方法都不可用的情況下,才會使用傳統路徑加載,這種方法性能很差 
 

Data Pump Job

 
當執行expdp/impdp時,其實是起了job執行導出導入工作,一個Data Pump job由以下三部分組成:
  1. 主進程(master process):控制整個job,是整個job的協調者。
  2. 主表(master table):記錄dumpfile里數據庫對象的元信息,expdp結束時將它寫入dumpfile里,impdp開始時讀取它,這樣才能知道dumpfile里的內容。
  3. 工作進程(worker processes):執行導出導入工作,根據實際情況自動創建多個工作進程並行執行,但不能超過參數PARALLEL定義的個數。
 

監控Job狀態

 
在屏幕的輸出、logfile里都能看到當前Data Pump Job的運行情況,在數據庫里也可以查詢視圖 DBA_DATAPUMP_JOBS, USER_DATAPUMP_JOBS, or  DBA_DATAPUMP_SESSIONS。
對於時間比較長的Job,可以在動態視圖V$SESSION_LONGOPS查看當前Job完成情況以及預估多久能全部完成,具體字段的意義如下:
[plain]  view plain  copy
 
 print?
  1. USERNAME - job owner  
  2. OPNAME - job name  
  3. TARGET_DESC - job operation  
  4. SOFAR - megabytes transferred thus far during the job  
  5. TOTALWORK - estimated number of megabytes in the job  
  6. UNITS - megabytes (MB)  
  7. MESSAGE - a formatted status message of the form:  
  8. 'job_name: operation_name : nnn out of mmm MB done'  

創建Directory

 
Data Pump不像exp/imp可以在客戶端執行,它必須得在服務器端執行,它生成的所有文件都放在服務器端,因此在Oracle里必須得先創建directory對象,下面是一個例子:
[sql]  view plain  copy
 
 print?
  1. SQL> CREATE DIRECTORY dpump_dir1 AS '/usr/apps/datafiles';  

創建了directory對象之后,還要把讀寫權限賦給執行Data Pump的用戶,如下所示:
[sql]  view plain  copy
 
 print?
  1. SQL> GRANT READ, WRITE ON DIRECTORY dpump_dir1 TO hr;  
 

導出模式

 
有以下5種導出模式,它們之間是互斥的,不可以同時使用,注意:有些schemas是不能被導出的,如 SYSORDSYS, and  MDSYS等。
 

Full模式

 
設置Full=y(默認為n),導出全庫,例子:
[plain]  view plain  copy
 
 print?
  1. > expdp user_name FULL=y DUMPFILE=expdat.dmp DIRECTORY=data_pump_dir LOGFILE=export.log  

Schema模式

 

導出一個或多個Schemas(參數SCHEMAS),默認導出當前用戶的schema,只有擁有DATAPUMP_EXP_FULL_DATABASE角色才能導出其它Schemas, 例子:

 

[plain]  view plain  copy
 
 print?
  1. > expdp hr DIRECTORY=dpump_dir1 DUMPFILE=expdat.dmp SCHEMAS=hr,sh,oe   

 

Table模式

 
導出表、分區以及它們依賴的對象,參數TABLES的語法如下:
[plain]  view plain  copy
 
 print?
  1. TABLES=[schema_name.]table_name[:partition_name] [, ...]  

如果schema_name省略,表示導出當前用戶schema下的表,
[plain]  view plain  copy
 
 print?
  1. expdp hr TABLES=employees,jobs DUMPFILE=dpump_dir1:table.dmp NOLOGFILE=YES  

Tablespace模式

 
導出一個或多個Tablespaces,參數TABLESPACES指定要導出的表空間
[plain]  view plain  copy
 
 print?
  1. > expdp hr DIRECTORY=dpump_dir1 DUMPFILE=tbs.dmp   
  2. TABLESPACES=tbs_4, tbs_5, tbs_6  

Transpotable Tablespace模式

 
只導出Tablespace的元數據,數據文件可由操作系統層拷貝
[plain]  view plain  copy
 
 print?
  1. > expdp hr DIRECTORY=dpump_dir1 DUMPFILE=tts.dmp  
  2. TRANSPORT_TABLESPACES=tbs_1 TRANSPORT_FULL_CHECK=YES LOGFILE=tts.log  

導出過程中的過濾

 

數據過濾

 
參數QUERY在行級別解析數據,其語法如下:
[plain]  view plain  copy
 
 print?
  1. QUERY = [schema.][table_name:] query_clause  
 
下面是一個例子:
[plain]  view plain  copy
 
 print?
  1. QUERY=employees:"WHERE department_id > 10 AND salary > 10000"  
  2. NOLOGFILE=YES   
  3. DIRECTORY=dpump_dir1   
  4. DUMPFILE=exp1.dmp  

參數SAMPLE指定導出百分比,其語法如下:
[plain]  view plain  copy
 
 print?
  1. SAMPLE=[[schema_name.]table_name:]sample_percent  

下面是一個例子:
[plain]  view plain  copy
 
 print?
  1. > expdp hr DIRECTORY=dpump_dir1 DUMPFILE=sample.dmp SAMPLE=70  

元數據過濾

 
元數據解析采用EXCLUDE,INCLUDE參數,注意:它們倆互斥。
EXCLUDE例子:
[plain]  view plain  copy
 
 print?
  1. expdp FULL=YES DUMPFILE=expfull.dmp EXCLUDE=SCHEMA:"='HR'"  
  2. > expdp hr DIRECTORY=dpump_dir1 DUMPFILE=hr_exclude.dmp EXCLUDE=VIEW,  
  3. PACKAGE, FUNCTION  

INCLUDE例子:
[plain]  view plain  copy
 
 print?
  1. SCHEMAS=HR  
  2. DUMPFILE=expinclude.dmp  
  3. DIRECTORY=dpump_dir1  
  4. LOGFILE=expinclude.log  
  5. INCLUDE=TABLE:"IN ('EMPLOYEES', 'DEPARTMENTS')"  
  6. INCLUDE=PROCEDURE  
  7. INCLUDE=INDEX:"LIKE 'EMP%'"  

主要參數說明

 
CONTENT:指定只導出數據、元數據還是全部
DIRECTORY:指定數據庫定義的DIRECTORY對象
DUMPFILE:指定dump文件名,如果定義了PARALLEL和FILESIZE,一定要包含通配符%U,如:
[plain]  view plain  copy
 
 print?
  1. > expdp hr SCHEMAS=hr DIRECTORY=dpump_dir1 DUMPFILE=dpump_dir2:exp1.dmp,  
  2.  exp2%U.dmp PARALLEL=3  

ESTIMATE_ONLY:如果你只想事先評估下dump文件占用空間大小,可以指定ESTIMATE_ONLY=yes
FILESIZE:指定每個文件大小上限
HELP:如果忘記參數,可以執行expdp help=y 顯示幫助信息
JOB_NAME:指定expdp的job名稱,一般不用指定,系統會指定默認唯一的JOB_NAME,可以在logfile里查看該Job的名稱
LOGFILE:指定日志文件名稱,默認為export.log
PARALLEL:默認為1,即不啟用並行,對於比較大的導出,建議適當增加並行度,但最大不能超過CPU個數的2倍
PARFILE:指定參數文件名稱
REMAP_DATA:假設你從生產庫導出敏感信息到測試庫上,為了不讓這些敏感信息泄露,可以在導出時對這些信息進行修改,從而達到保護敏感信息的作用。
REUSE_DUMPFILE:設置是否重用已有的DUMPFILE
 
 

導入模式

和導出模式一樣,以下5種模式也是互斥的。
 

Full模式

 
設置Full=yes即可,如果沒有DATAPUMP_IMP_FULL_DATABASE角色,只能導入到自己schema下的數據 
 

Schema模式

 
設置Schema參數,語法如下
SCHEMAS=schema_name [,...]
下面這個例子導入hr數據到hr schema下
[plain]  view plain  copy
 
 print?
  1. > impdp hr SCHEMAS=hr DIRECTORY=dpump_dir1 LOGFILE=schemas.log  
  2. DUMPFILE=expdat.dmp  

Table模式

 
設置Table參數,語法如下:
TABLES=[schema_name.]table_name[:partition_name]
如果沒有指定schema_name,默認表示導入當前用戶的schema下,如:
> impdp hr DIRECTORY=dpump_dir1 DUMPFILE=expfull.dmp TABLES=employees,jobs
也可以導入指定的分區:
> impdp hr DIRECTORY=dpump_dir1 DUMPFILE=expdat.dmp 
TABLES=sh.sales:sales_Q1_2012,sh.sales:sales_Q2_2012

Tablespace模式

設置Tablespace參數,其語法如下:
TABLESPACES=tablespace_name [, ...]
下面是一個例子,要注意的是:這些要導入的tablespace必須已經存在,否則會導入失敗。
> impdp hr DIRECTORY=dpump_dir1 DUMPFILE=expfull.dmp TABLESPACES=tbs_1,tbs_2,tbs_3,tbs_4

Transpotable Tablespace模式

設置Transpotable_tablespace參數,其語法定義如下:
TRANSPORT_TABLESPACES=tablespace_name [, ...]
只導入表空間的元數據,數據文件需有在操作系統層面拷貝至本機服務器下,路徑由Transport_datafiles指定,其語法如下:
TRANSPORT_DATAFILES=datafile_name
下面是一個具體例子:
DIRECTORY=dpump_dir1
NETWORK_LINK=source_database_link
TRANSPORT_TABLESPACES=tbs_6
TRANSPORT_FULL_CHECK=NO
TRANSPORT_DATAFILES='user01/data/tbs6.dbf'

導入過程中的過濾

和導出過程中的過濾類似,數據過濾用QUERY和SAMPLE,元數據過濾用EXCLUDE和INCLUDE。
 

主要參數說明

ACCESS_METHOD=[AUTOMATIC | DIRECT_PATH | EXTERNAL_TABLE | CONVENTIONAL]
定義導入方法,強烈建議采用默認設置AUTOMATIC,不要改動。
 
CONTENT=[ALL | DATA_ONLY | METADATA_ONLY]
定義只導入數據、元數據還是都要
 
DIRECTORY=directory_object
指定導入數據文件所在的文件夾
 
DUMPFILE=[directory_object:]file_name [, ...]
指定導入Dump文件名稱,可用通配符%U匹配多個Dump文件
 
HELP=YES
impdp help=y 顯示幫助信息
 
JOB_NAME=jobname_string
指定Job_name,一般默認即可
 
LOGFILE=[directory_object:]file_name
指定日志文件名
 
MASTER_ONLY=[YES | NO]
指定只導入master table,由於master table包含dumpfile的信息,這樣就可以指定dumpfile里包含哪些數據。
 
PARALLEL=integer
指定導入時的並行度
 
PARFILE=[directory_path]file_name
指定參數文件
 
REMAP_DATA=[schema.]tablename.column_name:[schema.]pkg.function
導入時對數據進行修改,比如重新生成PK防止和原有的PK沖突等。
 
REMAP_DATAFILE=source_datafile:target_datafile
可以解決異構平台間文件命名規范不同的問題
 
REMAP_SCHEMA=source_schema:target_schema
這個參數很常用,可以讓你導入到不同的schema中,如果target_schema不存在,導入時會自動創建,下面是一個例子:
> expdp system SCHEMAS=hr DIRECTORY=dpump_dir1 DUMPFILE=hr.dmp

> impdp system DIRECTORY=dpump_dir1 DUMPFILE=hr.dmp REMAP_SCHEMA=hr:scott
 
REMAP_TABLE=[schema.]old_tablename[.partition]:new_tablename
可以在導入時重命名表或分區,下面是一個例子:
> impdp hr DIRECTORY=dpump_dir1 DUMPFILE=expschema.dmp
TABLES=hr.employees REMAP_TABLE=hr.employees:emps 
REMAP_TABLESPACE=source_tablespace:target_tablespace
在導入時修改表空間名,下面是一個例子:
> impdp hr REMAP_TABLESPACE=tbs_1:tbs_6 DIRECTORY=dpump_dir1
  DUMPFILE=employees.dmp
REUSE_DATAFILES=[YES | NO]
是否重用數據文件,默認為NO,一定要謹慎,一旦設為YES,原有同名的數據文件將被覆蓋
 
SQLFILE=[directory_object:]file_name
如果指定該參數,則不真正執行導入,而是把導入時所需的DDL SQL寫入到SQLFILE里。
 
 
 

expdp的network_link

 
我們知道,expdp默認是導出本地數據庫,network_link的作用是導出遠程數據庫到本地服務器上,其步驟如下:
 
術語說明:
源數據庫:遠程數據庫
目標數據庫:本地數據庫(即expdp客戶端所在的服務器)
 
1. 在目標數據庫端添加源數據庫的連接字符串至tnsnames.ora:
[plain]  view plain  copy
 
 print?
  1. source_db =  
  2.   (DESCRIPTION =  
  3.     (ADDRESS_LIST =  
  4.       (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.15)(PORT = 1521))  
  5.     )  
  6.     (CONNECT_DATA =  
  7.       (sid = orcl)  
  8.     )  
  9.   )  

2. 在目標數據庫創建db link:
[plain]  view plain  copy
 
 print?
  1. SQL>create public database link source_db_link connect to system identified by *** using 'test15';  
  2.   
  3. Database link created.  
  4.   
  5. SQL>select instance_name from v$instance@source_db;  
  6.   
  7. INSTANCE_NAME  
  8. ----------------  
  9. orcl  

3. 在目標服務器執行expdp:
[plain]  view plain  copy
 
 print?
  1. $ expdp system directory=dump_dir network_link=test15 tables=test.test dumpfile=test.dmp logfile=expdp_test.log  

其中network_link等於第2步上創建的db link,dumpfile,logfile放在目標數據庫的dump_dir
 

impdp的network_link

上面提到的expdp的network_link是把遠程數據庫導出至本地的dumpfile,而impdp更強大更方便,它可以直接把遠程數據庫導入至本地數據庫,中間甚至沒有dumpfile產生,其語法如下:
[plain]  view plain  copy
 
 print?
  1. $ impdp system directory=dump_dir network_link=test15 tables=test.test logfile=impdp_test.log  

上面語句直接把test.test表從源數據庫導入至目標數據庫,中間不產生dumpfile,到會產生logfile(logfile放在目標數據庫端的dump_dir里)
 
 
 
 

當我們起了一個datapump job之后,可以通過v$session_longops查看當前進度。

 

[plain]  view plain  copy
 
 print?
  1. USERNAME - job owner    
  2. OPNAME - job name    
  3. TARGET_DESC - job operation    
  4. SOFAR - megabytes transferred thus far during the job    
  5. TOTALWORK - estimated number of megabytes in the job    
  6. UNITS - megabytes (MB)    
  7. MESSAGE - a formatted status message of the form:    
  8. 'job_name: operation_name : nnn out of mmm MB done'    

 

 

[sql]  view plain  copy
 
 print?
  1. SYS@TEST16>select username,opname,sofar,TOTALWORK,UNITS,message from v$session_longops where opname='SYS_EXPORT_FULL_03';  
  2.   
  3. USERNAME        OPNAME                    SOFAR  TOTALWORK UNITS MESSAGE  
  4. --------------- -------------------- ---------- ---------- ----- ------------------------------------------------------------  
  5. SYSTEM          SYS_EXPORT_FULL_03         4737      35368 MB    SYS_EXPORT_FULL_03: EXPORT : 4737 out of 35368 MB done  

但有時候單單監控是不夠的,我們可能還需要修改相應的JOB,這時我們就需要進行datapumo的命令交互模式。

有兩種方式可以進入命令交互模式,分別是:

1. 在logging模式下按ctrl+C

2. expdp or impdp attach=SYSTEM.SYS_EXPORT_FULL_03

 

expdp交互模式的命令如下:

 

Activity Command Used

Add additional dump files.

ADD_FILE

Exit interactive mode and enter logging mode.

CONTINUE_CLIENT

Stop the export client session, but leave the job running.

EXIT_CLIENT

Redefine the default size to be used for any subsequent dump files.

FILESIZE

Display a summary of available commands.

HELP

Detach all currently attached client sessions and terminate the current job.

KILL_JOB

Increase or decrease the number of active worker processes for the current job. This command is valid only in the Enterprise Edition of Oracle Database 11g.

PARALLEL

Restart a stopped job to which you are attached.

START_JOB

Display detailed status for the current job and/or set status interval.

STATUS

Stop the current job for later restart.

STOP_JOB


 

impdp的交互模式命令如下:

 

Activity Command Used

Exit interactive-command mode.

CONTINUE_CLIENT

Stop the import client session, but leave the current job running.

EXIT_CLIENT

Display a summary of available commands.

HELP

Detach all currently attached client sessions and terminate the current job.

KILL_JOB

Increase or decrease the number of active worker processes for the current job. This command is valid only in Oracle Database Enterprise Edition.

PARALLEL

Restart a stopped job to which you are attached.

START_JOB

Display detailed status for the current job.

STATUS

Stop the current job.

STOP_JOB

 

 

下面以expdp為例,介紹幾個常用命令(如果忘記命令,敲萬能的help)。

1. status:查看當前job的狀態,如完成的百分比、並行度等,每個worker代表一個並行進程。

 

[sql]  view plain  copy
 
 print?
  1. Export> status  
  2.   
  3. Job: SYS_EXPORT_FULL_03  
  4.   Operation: EXPORT                           
  5.   Mode: FULL                             
  6.   State: EXECUTING                        
  7.   Bytes Processed: 8,357,285,928  
  8.   Percent Done: 23  
  9.   Current Parallelism: 2  
  10.   Job Error Count: 0  
  11.   Dump File: /home/oracle/dump/full_%u.dmp  
  12.   Dump File: /home/oracle/dump/full_01.dmp  
  13.     bytes written: 8,357,294,080  
  14.   Dump File: /home/oracle/dump/full_02.dmp  
  15.     bytes written: 4,096  
  16.     
  17. Worker 1 Status:  
  18.   Process Name: DW00  
  19.   State: EXECUTING                        
  20.   Object Type: DATABASE_EXPORT/SCHEMA/TABLE/COMMENT  
  21.   Completed Objects: 5,120  
  22.   Worker Parallelism: 1  
  23.     
  24. Worker 2 Status:  
  25.   Process Name: DW01  
  26.   State: EXECUTING                        
  27.   Object Schema: P95169  
  28.   Object Name: GRADE_RCCASE  
  29.   Object Type: DATABASE_EXPORT/SCHEMA/TABLE/TABLE_DATA  
  30.   Completed Objects: 3  
  31.   Total Objects: 1,866  
  32.   Completed Rows: 23,505,613  
  33.   Worker Parallelism: 1  

2. parallel:動態調整並行度

 

 

[plain]  view plain  copy
 
 print?
  1. Export> parallel=4  

3. add_file:增加dumpfile

 

 

[plain]  view plain  copy
 
 print?
  1. Export> ADD_FILE=hr2.dmp, dpump_dir2:hr3.dmp  

4. stop_job, kill_job, start_job

 

stop_job只是暫停,之后可以用start_job重新啟動,而kill_job直接殺掉,不可恢復

5. continue_client:退出交互模式,進入logging模式;

exit_client: 退出客戶端

 
 轉:http://blog.csdn.net/dbanote/article/details/9428837
文章可以轉載,必須以鏈接形式標明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM