Oracle數據庫expdp用法以及注意事項

1、導出注意事項html

檢查數據庫版本(用於決定導出時生成爲哪一個版本的dmp頭文件) select version from v$instance; 也能夠用sqlplus -v 查看。  git

檢查字符集是否一致(字符集不一致,不能導入) select userenv('language') from dual;  sql

檢查數據量及磁盤空間(決定採起什麼樣的方式導出及導入)shell

2、expdp和exp的區別數據庫

在10g以前,傳統的導出和導入分別使用EXP工具和IMP工具,從10g開始,不只保留了原有的EXP和IMP工具,還提供了數據泵導出導入工具EXPDP和IMPDP:服務器

一、EXP和IMP是客戶端工具程序,它們既能夠在能夠客戶端使用,也能夠在服務端使用。session

二、EXPDP和IMPDP是服務端的工具程序,他們只能在ORACLE服務端使用,不能在客戶端使用,客戶端只能用來鏈接服務器啓動導入導出操做,導出文件只存儲在服務端。併發

三、IMP只適用於EXP導出文件,不適用於EXPDP導出文件;IMPDP只適用於EXPDP導出文件,而不適用於EXP導出文件。oracle

四、EXPDP/IMPDP在備份和恢復時間上要比EXP/IMP有着優點,並且文件要小的多。app

五、使用EXPDP/IMPDP管理更加靈活。支持並行;可中斷;能夠修改元數據文件名字、表空間名;支持元數據導入導出;估算導出數據所需空間;指定導入數據庫版本等。

3、expdp使用方法

一、建立expdp導出目錄,默認導出目錄爲D:\app\Administrator/admin/orcl/dpdump/(其中前面爲Oracle安裝目錄)。

create or replace directory 目錄名 as '目錄路徑'
--例:create or replace directory dmp as 'D:/app/dmp'

注意:目錄路徑必須是已經存在的目錄,若是目錄不存在,也會顯示目錄常見成功(語句不會自動去常見目錄),在執行expdp時候會報如下錯誤:

ORA-39002: 操做無效

ORA-39070: 沒法打開日誌文件。

二、查看當前建立的全部dmp導出目錄  (驗證看是否建立成功)

select * from dba_directories

image

三、爲建立的目錄賦權限,須要以其餘用戶運行,建議在sys用戶下執行。

grant read,write on directory 目錄名 to 須要賦值的用戶名
--例:grant read,write on directory dmp to GISDATA;

四、導出(這裏使用最簡單的導出方式)

expdp 用戶名/密碼@數據庫實例名 directory=導出目錄 dumpfile=導出的文件名.dmp logfile=導出的日誌名.log
--例:expdp GISDATA/GISDATA@LOCALHOST/orcl directory=dmp dumpfile=GISDATA20200921.dmp logfile=GISDATA20200921.log 

4、經常使用導出命令

一、按用戶導
expdp
GISDATA/GISDATA@localhost/orcl schemas=GISDATA dumpfile=expdp.dmp directory=dmp  logfile=expdlog.log;
二、並行進程parallel
expdp
GISDATA/GISDATA@localhost/orcl directory=dmp dumpfile=expdp.dmp parallel=40 job_name=expdpjob logfile=expdlog.log
三、按表名導
expdp
GISDATA/GISDATA@localhost/orcl TABLES=test1,test2 dumpfile=expdp.dmp directory=dmp  logfile=expdlog.log;
四、按查詢條件導
expdp
GISDATA/GISDATA@localhost/orcl directory=dmp  dumpfile=expdp.dmp Tables=test query='WHERE id<20' logfile=expdlog.log;
五、按表空間導
expdp
GISDATA/GISDATA directory=dmp  dumpfile=expdp.dmp TABLESPACES=GIDDATA,YWDATA logfile=expdlog.log;
六、導整個數據庫
expdp
GISDATA/GISDATA directory=dmp  dumpfile=expdp.dmp FULL=y logfile=expdlog.log;

5、expdp參數說明

能夠輸入expdp help=y命令查看其參數說明。

image

  • ATTACH
做用
    當咱們使用ctrl+C 退出交互式命令時,可心使用attach參數從新進入到交互模式
語法
    ATTACH=[schema_name.]job_name
    Schema_name用戶名,job_name任務名
示例
    Expdp scott/tiger ATTACH=scott.export_job
  • CONTENT
做用
    限制了導出的內容,包括三個級別:所有/數據/元數據(結構)
語法
   CONTENT={ALL | DATA_ONLY | METADATA_ONLY}
   ALL           -- 導出全部數據,包括元數據及數據
   DATA_ONLY     -- 只導出數據
   METADATA_ONLY -- 只包含元數據,就是建立語句
示例
   Expdp scott/tiger DIRECTORY=dump DUMPFILE=a.dump CONTENT=METADATA_ONLY
  • DIRECTORY
做用
此路徑能夠理解爲實際絕對路徑在oracle數據庫裏的別名,是導出文件的存儲位置
    路徑的建立: create directory &DIRECTORY_NAME AS '&PATH';
    查看已存在路徑: select  * from dba_directories;
語法
    directory=[directory_name]
示例
    Expdp scott/tiger DIRECTORY=dump_dir DUMPFILE=lhb.dump
  • DUMPFILE
做用
    此參數用戶命名導出文件,默認是 expdat.dmp. 文件的存儲位置若是在文件名前沒有指定directory,則會默認存儲到directory參數指定的路徑下。
語法
    DUMPFILE=[dump_dir:]file_name
示例
    Expdp scott/tiger DIRECTORY=dump_dir DUMPFILE=dump_dir1:a.dmp
  • ESTIMATE
在使用Expdp進行導出時,Expdp須要計算導出數據大小容量,Oracle能夠經過兩種方式進行容量估算,一種是經過數據塊(blocks)數量、一種是經過統計信息中記錄的內容(statistics)估算.

語法結構:
    EXTIMATE={BLOCKS | STATISTICS}
示例:
    Expdp scott/tiger TABLES=emp ESTIMATE=STATISTICS DIRECTORY=dump_dir DUMPFILE=halberd.dump
    Expdp scott/tiger TABLES=emp ESTIMATE=BLOCKS DIRECTORY=dump_dir DUMPFILE=halberd.dump
  • EXTIMATE_ONLY
做用
    此參數用於統計導出的數據量大小及統計過程耗時長短。
語法
    EXTIMATE_ONLY={Y | N}
示例
    Expdp scott/tiger ESTIMATE_ONLY=y NOLOGFILE=y directory=dump_dir schemas=halberd
  • EXCLUDE
做用
    此參數用於排除不須要導出的內容,如咱們進行全庫導出,可是不須要導出用戶scott,此時須要在exlude後先指定排除類型爲schema,再指定具體的schema。具體使用方法見include參數. EXCLUDE與include的使用方法是同樣的
語法
    EXCLUDE=object_type[:name_clause] [,object_type[:name_clause] ]
    name_clause
        "='object_name'"
        "in ('object_name'[,'object_name',....])"
        "in (select_clause) "
    Object_type對象類型,如:table,view,procedure,schema等
    name_clause指定名稱的語句,若是不具體指定是哪一個對象,則此類全部對象都不導出, select 語句中表名不要加用戶名。用戶名,經過schemas 指定。

示例
    expdp scott/tiger DIRECTORY=dump_dir DUMPFILE=halberd.dup EXCLUDE=VIEW
    expdp scott/tiger DIRECTORY=dump_dir DUMPFILE=halberd.dup EXCLUDE=TABLE:\" IN\(\'TEMP\',\'GRADE\'\)\"
    EXCLUDE=TABLE:"='APPLICATION_AUDIT'"
  • FILESIZE
做用
    用於指定單個導出的數據文件的最大值,與%U一塊兒使用。好比,咱們須要導出100G的數據,文件所有存儲到一個文件內,在文件傳輸時,會耗費大量的時間,此時咱們就可使用這個參數,限制每一個文件的大小,在傳輸導出文件時,就能夠多個文件同時傳送,大大的節省了文件傳輸時間。提升了工做的效率。
語法
  FILESIZE=integer[B | K | M | G]
示例
   Expdp scott/tiger DIRECTORY=dump_dir DUMPFILE=halberd%U.dup FILESIZE=20g
  • FLASHBACK_SCN/FLASHBACK_TIME
做用
    基於undo 及scn號(時間點)進行的數據導出。使用此參數設置會進行flashback query的功能,查詢到對應指定的SCN時的數據,而後進行導出。只要UNDO不被覆蓋,不管數據庫是否重啓,均可以進行導出. flashback_time參數與flashback_scn的原理是同樣的。在導出的數據裏保持數據的一致性是頗有必要的。這個。。我想,沒誰傻忽忽的把這兩個參數一塊兒使用吧?因此我就不提醒你兩個參數不能夠同時使用了。
語法
   FLASHBACK_SCN=scn_value
   FLASHBACK_TIME 有多種設定值的格式:
   flashback_time=to_timestamp (localtimestamp)
   flashback_time=to_timestamp_tz (systimestamp)
   flashback_time="TO_TIMESTAMP (""25-08-2003 14:35:00"", ""DD-MM-YYYY HH24:MI:SS"")"  使用此格式可能會遇到ORA-39150錯誤。
示例
   Expdp scott/tiger DIRECTORY=dump_dir DUMPFILE=halberd.dmp FLASHBACK_SCN= 12345567789
   Expdp scott/tiger DIRECTORY=dump_dir DUMPFILE=halberd.dmp FLASHBACK_TIME= to_timestamp (localtimestamp)
  • FULL
做用
   指定導出內容爲全庫導出。這裏須要特別注意的是,expdp 不能導出sys用戶對象。即便是全庫導出也不包含sys用戶。
語法
   FULL={Y | N}
示例
   expdp \'\/ as sysdba\' directory=dump_dir full=y
  • HELP
做用
    當咱們對參數的意義不瞭解時,或者忘記參數怎麼寫時,就能夠用這個參數,來尋求幫助,實際上和操做系統裏的man命令是同樣的。
示例
    impdp -help
    expdp help=y
  • INCLUDE
做用
    限制範圍,指定本身想要的內容,好比要導出某個用戶的某張表。
語法
    INCLUDE = object_type[:name_clause],object_type[:name_clause]
示例
    impdp dbmon/dbmon_123 directory=dump_dir network_link=zjzwb2 SCHEMAS=AICBS remap_schema=aicbs:aicbsb include=table:\"IN\(SELECT TABLE_NAME FROM dbmon.TABLES_TOBE_MASKED\)\"  LOGFILE=zjzwb.log transform=segment_attributes:n
    PARFILE中設置:
        INCLUDE=table:"in(select table_name from dba_tables where owner='AA')"
        INCLUDE=TABLE:"IN('TEST1','TEST2')"
    SHELL環境設置:
        INCLUDE=TABLE:\"IN\(SELECT TABLE_NAME FROM DBA_TABLES WHERE OWNER=\'AA\'\)\"
        INCLUDE=TABLE:\"IN\(\'TEST1\',\'TEST2\'\)\"
說明
    當導入命令在目標端發起時,select 子句所涉及的表要在源端,而且dblink 所使用的用戶有訪問的權限。
  • JOB_NAME
做用
    指定任務名,若是不指定的話,系統會默認自動命名:SYS_EXPORT_mode_nn
語法
    JOB_NAME=&JOB_NAME
其餘
    查看有哪些expdp/impdp job,能夠經過dba_datapump_jobs查看,其實你經過v$session.action也能夠查看到
    大多與attach參數一塊兒使用,從新進行expdp交互命令時使用。
  • LOGFILE
做用: 指定導出日誌名稱。默認是:expdp.log
語法
    LOGFILE=[DIRECTORY:]file_name   , 若是參數值裏沒有指定路徑,會默認使用directory參數值所指向的路徑。
    directory : 存儲路徑,
    file_name :日誌文件名
示例
    expdp scott/tiger DIRECTORY=dump_dir DUMPFILE=halberd.dmp logfile=halberd.log
    impdp scott/tiger DIRECTORY=dump_dir DUMPFILE=halberd.dmp logfile=halberd.log
  • NETWORK_LINK
做用
    此參數只有在導入(impdp)時使用,可經過本地數據庫裏的db_link鏈接到其餘數據庫A,將數據庫A的數據直接導入到本地數據庫。中間可節省導出數據文件,傳送數據文件的過程。很方便。可是要特別注意,不一樣版本之間可能會存在問題,好比源庫爲10g,目標庫爲11g。使用network_link參數會報錯。至於 12C 與低版本之間是否有問題還沒有嘗試。
語法
    network_link=[db_link]
示例
    impdp scott/tiger DIRECTORY=dump_dir DUMPFILE=halberd.dmp NETWORK_LINK=to_tjj SCHEMAS=halberd logfile=halberd.log
  • NOLOGFILE
做用
    不寫導入導出日誌,這個筆者是灰常灰常滴不建議設置爲「Y」滴。
語法
    nologfile=[y|n]
  • PARALLEL
做用
    指定導出/導入時使用多少個併發,默認是1.
語法
    parallel=[digit]
示例
    expdp \'\/ as sysdba\' directory=dump_dir schemas=halberd dumpfile=halberd%U.dmp parallel=8 logfile=halberd.log
  • PARFILE
做用
    參數文件,這個參數文件裏,存儲着一些參數的設置。好比上面說過的,parallel,network_link,等。導出時,可使用此參數,expdp/impdp會自動讀取文件中的參數設置,進行操做。
語法
    PARFILE=[directory_path] file_name
示例
   expdp \'\/ as sysdba\' parfile=halberd.par
   cat halberd.par
   directory=dump_dir                          
   logfile=test.log                            
   schemas=test                                
   query="where create_date > last_day(add_months(sysdate,-1)) and create_date <= last_day(sysdate)" 
   transform=segment_attributes:n                 
   network_link=to_aibcrm
   table_exists_action=append                    
   impdp \'\/ as sysdba\' parfile=test.par
  • QUERY
做用
    此參數指定在導入導出時的限制條件,和SQL語句中的 "where" 語句是同樣兒同樣兒滴
語法
    QUERY=([schema.] [table_name:] query_clause, [schema.] [table_name:] query_clause,……)
    CONTENT=METADATA_ONLY, EXTIMATE_ONLY=Y,TRANSPORT_TABLESPACES.
示例
   Expdp scott/tiger directory=dump dumpfiel=a.dmp Tables=emp query="WHERE deptno<>20"
  • SCHEMAS
做用
    指定導出/導入哪一個用戶
語法
    schemas=schema_name[,schemaname,....]
示例
    expdp \'\/ as sysdba\' directory=dump_dir schemas=halberd
  • REMAP_SCHEMA
 只在導入時使用
做用
    當把用戶A的對象導入到用戶(其實應該叫schema,將就看吧)B時,使用此參數,可實現要求
格式
    remap_schema=schema1: schema2
示例
    impdp \'\/ as sysdba\' directory=dump_dir dumpfile=halberd.dmp logfile=halberd.log remap_schema=scott:halberd
  • TABLES
做用
    指定導出哪些表。
格式
    TABLES=[schema.]table_name[:partition_name][,[schema.]table_name[:partition_name]]
說明
    Schema 表的全部者;table_name表名;partition_name分區名.能夠同時導出不一樣用戶的不一樣的表
示例
    expdp \'\/ as sysdba\' directory=dump_dir tables=emp.emp_no,emp.dept
  • TABLESPACES
做用
    指定導出/導入哪一個表空間。
語法
    tablespaces=tablespace_name[,tablespace_name,....]
示例
    expdp \'\/ as sysdba\' directory=dump_dir tablespace=user
  • REMAP_TABLESPACE
做用
    只有在導入時使用,用於進行數據的表空間遷移。 把前一個表空間中的對象導入到冒號後面的表空間
用法
    remap_tablespace=a:b
說明
   a: 數據所在的原表空間; b: 目標表空間
示例
   impdp \'\/ as sysdba\' directory=dump_dir tables=emp.dept remap_tablespace=user:user1
  • TRANSPORT_FULL_CHECK
檢查須要進行傳輸的表空間與其餘不須要傳輸的表空間之間的信賴關係,默認爲N。當設置爲「Y」時,會對錶空間之間的信賴關係進行檢查,如A(索引表空間)信賴於B(表數據表空間),那麼傳輸A而不傳輸B,則會出錯,相反則不會報錯。
  • TRANSPORT_TABLESPACES
做用
    列出須要進行數據傳輸的表空間
格式
     TRANSPORT_TABLESPACES=tablespace1[,tablespace2,.............]
  • TRANSFORM
做用
  此參數只在導入時使用,是一個用於設定存儲相關的參數,有時候也是至關方便的。假如數據對應的表空間都存在的話,就根本用不到這個參數,可是,假如數據存儲的表空間不存在,使用此參數導入到用戶默認表空間就能夠了。更靈活的,可使用remap_tablespace參數來指定。
格式
    transform=transform_name:value[bject_type]
    transform_name = [OID | PCTSPACE | SEGMENT_ATTRIBUTES | STORAGE]:[Y|N]
    segment attributes:段屬性包括物理屬性、存儲屬性、表空間和日誌,Y 值按照導出時的存儲屬性導入,N時按照用戶、表的默認屬性導入
    storage:默認爲Y,只取對象的存儲屬性做爲導入做業的一部分
    oid:  owner_id,若是指定oid=Y(默認),則在導入過程當中將分配一個新的oid給對象表,這個參數咱們基本不用管。
    pctspace:經過提供一個正數做爲該轉換的值,能夠增長對象的分配尺寸,而且數據文件尺寸等於pctspace的值(按百分比)
示例
    transform=segment_attributes:n --表示將用戶全部對象建立到用戶默認表空間,而再也不考慮原來的存儲屬性。
  • VERSION
此參數主要在跨版本之間進行導數據時使用,更具體一點,是在從高版本數據庫導入到低版本數據庫時使用,從低版本導入到高版本,這個參數是不可用的。默認值是:compatible。此參數基本在導出時使用,導入時基本不可用。
VERSION={COMPATIBLE | LATEST | version_string}
COMPATIBLE       : 以參數compatible的值爲準,能夠經過show parameter 查看compatible參數的值
LATEST           : 以數據庫版本爲準
version_string   : 指定版本。如: version=10.2.0.1
  • SAMPLE
 SAMPLE 給出導出表數據的百分比,參數值能夠取.000001~100(不包括100)。不過導出過程不會和這裏給出的百分比同樣精確,是一個近似值。 
 格式: SAMPLE=[[schema_name.]table_name:]sample_percent 
 示例: SAMPLE="HR"."EMPLOYEES":50
  • table_exists_action
此參數只在導入時使用。
做用:導入時,假如目標庫中已存在對應的表,對於這種狀況,提供三種不一樣的處理方式:append,truncate,skip,replace
格式: table_exists_action=[append | replace| skip |truncate]
說明: append :   追加數據到表中
       truncate:  將目標庫中的同名表的數據truncate掉。
       skip :      遇到同名表,則跳過,不進行處理,注意:使用此參數值時,與該表相關的全部操做都會skip掉。
       replace:    導入過程當中,遇到同名表,則替換到目標庫的那張表(先drop,再建立)。
示例:  table_exists_action=replace
  • SQLFILE
只在導入時使用!
做用: 使用此參數時,主要是將DMP文件中的metadata語句取出到一個單獨的SQLfile中,而數據並不導入到數據庫中
格式: sqlfile=&file_name.sql
示例: impdp \'\/ as sysdba\' directory=dump_dir dumpfile=halberd.dmp logfile=halberd.log sqlfile=halberd.sql
legacy mode 
在11g中,纔有這種模式。這種模式裏兼容了之前版本中的部分參數,如:consistent,reuse_dumpfiles等(其實我如今也就知道這兩個參數,哈哈,之後再遇到再補充)
  • consistent
這個是保持數據一致性的一個參數。在11g中使用時,若是設置 consistent=true,則會默認轉換成 flashback_time參數,時間設置爲命令開始執行的那個時間點。
格式: consistent=[true|false]
  • reuse_dumpfiles
做用:重用導出的dmp文件 。假如第一次咱們導失敗了,雖然導出失敗,可是dmp文件 還 是會生成的。在修改導出命令,第二次執行時,就能夠 加上這個參數。
格式: reuse_dumpfile=[true|false]
  • partition_options
1 NONE 不對分區作特殊處理。在系統上的分區表同樣建立。
2 DEPARTITION 每一個分區表和子分區表做爲一個獨立的表建立,名字使用表和分區(子分區)名字的組合。
3 MERGE 將全部分區合併到一個表 
注意:若是導出時使用了TRANSPORTABLE參數,這裏就不能使用NONE和MERGE

6、使用技巧

一、不生成文件直接導入目標數據庫

在一些狀況下,咱們並無足夠的存儲空間容許咱們存儲導出的dmp文件。這個時候,咱們就機關用盡了麼? 不是的。咱們能夠不生成dmp文件,直接將數據抽取到目標數據。在遷移大量數據而沒有充足存儲空間時,這是一個救命稻草。 最關鍵的點就是在目標端執行impdp的時候,使用network_link,直接從源庫抽取數據。 示例以下:

cat test.par
directory=dump_dir
logfile=test.log
schemas=test
query="where create_date > last_day(add_months(sysdate,-1)) and create_date <= last_day(sysdate)"
transform=segment_attributes:n
network_link=to_aibcrm
table_exists_action=append
impdp \'\/ as sysdba\' parfile=test.par/
二、經過shell腳本自動導入

此處只關注,impdp 命令在shell腳本中執行,須要轉義的地方。

cat import_sr.sh
#!/bin/sh
cd /u01/app
for da in 2012-10 2013-09 2013-08 2013-07 2013-06 2013-05 2013-04 2013-03 2013-02 2013-01 2012-12 2012-11 2014-08 2014-07 2014-06 2014-05 2014-04 2014-03 2014-02 2014-01 2013-12 2013-11 2013-10 2015-07 2015-06 2015-05 2015-04 2015-03 2015-02 2015-01 2014-12 2014-11 2014-10 2014-09 2016-06 2016-05 2016-04 2016-03 2016-02 2016-01 2015-12 2015-11 2015-10 2015-09 2015-08 2017-05 2017-04 2017-03 2017-02 2017-01 2016-12 2016-11 2016-10 2016-09 2016-08 2016-07;
do
impdp \'\/ as sysdba\' parfile=import_sr.par logfile=sr${da}.log query=\" where create_date\> last_day\(add_months\(to_date\(\'$da\',\'yyyy-mm\'\),-1\)\) and create_date \<\=last_day\(to_date\(\'$da\',\'yyyy-mm\'\)\)\"
done

-- 參數文件內容
directory=dump_dir
tables=SR.SR_VOUCHER_FILE_tomig
remap_table=sr.SR_VOUCHER_FILE_tomig:sr_his.sr_voucher_file
transform=segment_attributes:n
network_link=to_aibcrm
table_exists_action=append
三、如何導出數百張表

include=table:"in (select * from &table_name where_clause)" &table_name :+: 在表裏存儲須要導出的代表細

7、參考地址

文中部份內容出自如下地址,特此註明出處。

http://blog.itpub.net/29785807/viewspace-1593229/

http://www.javashuo.com/article/p-zvprrzul-nh.html

http://www.javashuo.com/article/p-ogupzgen-gq.html

https://blog.csdn.net/zhongguomao/article/details/78933333

相關文章
相關標籤/搜索