datapump簡介(一)

jeanron100發表於2015-07-19
datapump是在10g之後推出的新特性,無論從功能還是效能上,都有一定的改進,可以說在功能上豐富了很多,在效能上也提升了很多。可以說exp/imp中能實現的功能,肯定在datapump裡面都能實現,而且大多數情況下效果還要好一些。
當然datapump相比exp/imp推出的時間還是要短一些,所以在使用的過程中還是或多或少碰到一些問題,還是在不斷改進,而exp/imp絕對算是一款成熟的工具,從早期版本到現在都在支援,而datapump相比於exp/imp的最大差別就在於datapump是屬於服務端的程式,生成的dump只能位於服務端,而不能把它匯出到客戶端。所以說對於資料的邏輯備份來說還是有很多的選擇。可以靈活使用exp/imp,也可以在一定規模的資料情況下使用datapump。
datapump和exp/imp類似,也有四種使用模式:資料庫模式,表模式,使用者模式,可傳輸表空間模式,在此基礎上使用比較多的還有基於query選項的資料選擇性抽取和資料結構匯出。
當然在使用下我們還是需要一些準備,就是建立目錄,因為datapump是一個服務端的程式,所以需要指定本地的一個目錄結構,它會解析這個目錄然後把dump生成在這個目錄下面。
建立目錄的語法如下:
create directory test_dir as '/home/ora11g/expdp_test';

在此基礎上我們可以根據需要把讀寫的許可權賦予指定的使用者,這樣就可以靈活去讀寫這個目錄了。
比如我們把目錄test_dir的讀寫許可權賦予使用者test,就可以使用下面的形式。
grant read,write on directory test_dir to test;

資料庫模式

資料庫模式主要是作為全庫備份使用的,可以匯出除sys之外的資料庫裡的所有物件,在資料量較小的情況下是一個不錯的選擇。

expdp system/oracle dumpfile=db_backup.dmp full=y directory=test_dir

表模式

表模式可以匯出某個使用者下指定的表,比如我們需要匯出的表名為:test1,test2

expdp n1/n1 dumpfile=table_mode.dmp tables=test1,test2 directory=test_dir

使用者模式

使用者模式可以匯出指定使用者下所有的物件,比如匯出使用者user1下所有的物件

expdp n1/n1 file=user_mode.dmp schemas=user1 directory=test_dir

傳輸表空間模式 常作為資料遷移時的一種方法,在資料遷移篇中會有詳細的描述 海量資料遷移之傳輸表空間(一)  http://blog.itpub.net/23718752/viewspace-1703358/

在impdp中也會存在同樣的四種模式,使用方法都是類似的。

除了常用的4種模式之外,使用query選項選擇性匯出資料也是一種很使用的方法。比如存在一個表test,我們希望根據欄位object_id=1的條件來選擇性匯出資料,可以使用query選項完成。

使用Query選項做選擇性資料匯出

expdp n1/n1 dumpfile=query_bak.dmp query=\' where object_id=1 \' tables=test directory=test_dir
在這個方面,expdp的query功能更為強大。
比如我們需要匯出兩個表test1,test2,對於test1需要根據條件"where object_id=1"來匯出,test2沒有其它過濾條件
我們可以這樣使用expdp的query選項,使用一個parfile來更高效完成。
parfile的內容如下:
tables=(t,test_tab01)
query=t:"where object_id=1"
然後使用expdp命令匯出即可。
expdp n1/n1 dumpfile=query_bak.dmp parfile=dp.par directory=test_dir

當然了,expdp的一些實用特性還是蠻多的。可以舉幾個例子。
第一個就是表空間不匹配的問題
比如表中存在lob欄位或者與目標環境的表空間不一致,使用Imp匯入dump的時候就會丟擲下面的錯誤。
IMP-00003: ORACLE error 959 encountered
ORA-00959: tablespace 'DATAS01' does not exist
對於這類問題使用exp/imp的時候還是比較棘手的,可能需要解析dump檔案,或者使用dbms_metadata來從源庫中得到ddl語句。
在expdp中解決起來就很容易。我們可以使用remap_tablespace的選項,比如我們在匯出的環境中存在表空間TEST_OLD,在目標環境沒有這個表空間,我們需要把表建立在TEST_NEW表空間下,我們可以使用remap_tablespaces選項。
impdp n1/n1 dumpfile=table_mode.dmp tables=test1,test2 directory=test_dirremap_tablespace=TEST_OLD:TEST_NEW
第二個就是匯出procedure,function等物件的資訊
在exp中,如果你使用使用者模式和全庫模式,會預設匯出儲存過程,序列這些物件的資訊,但是這些不是由我們手工去控制的。在匯入的時候如果使用full=y的時候才會把這些物件給隱式匯入。
在datapump中解決起來也很容易。
比如我們只需要匯出使用者test下的儲存過程,函式和序列資訊。就可以直接使用下面的語句來做。
expdp test/test dumpfile=query_bak.dmp directory=test_dir schemas=test include=procedcure,function,sequence
甚至我們可以更加挑剔,直接去篩選哪些需要匯出,哪些不需要。
比如我們到處sequence的時候只匯出序列名為:_seq結尾的序列
我們還是使用parfile來簡單配置。
parfile的內容為:
include=procedure
include=function
include=sequence:"like '%_SEQ%'"
schemas=test
然後我們使用命令匯出:
expdp test/test dumpfile=query_bak.dmp  directory=test_dir parfile=dp.par
第三個就是使用排除選項exclude
exp/imp的時候我們還不能使用排除選項,比如使用者test下有100張表,我們不希望匯出某張表test1
我們可以使用datapump輕鬆實現。
我們使用parfile來配置。
exclude=table:"='TEST1'"
使用如下的命令即可。
expdp test/test dumpfile=query_bak.dmp  directory=test_dir parfile=dp.par

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-1740693/,如需轉載,請註明出處,否則將追究法律責任。

相關文章