淺談exp/imp(下)

jeanron100發表於2015-06-30

你可能 不瞭解的dump檔案

在工作中,dump檔案對於dba而言是再平常不過的檔案了。不過因為dump檔案是二進位制檔案,所以大家可能在平時使用中也不太關注,不過儘管如此,在匯入dump檔案的時候還是有很多的細節和技巧值得注意,可以避免一些不必要的問題。  

$ strings test.dump|head -10 
iEXPORT:V11.02.00 
RUSERS 
8192 
Sun Dec 28 6:54:27 2014test.dump 
#G#G 
#G#G 
-08:00 
BYTE 
UNUSED 
INTERPRETED 

根據上面的命令輸出,我們得到了一些dump的基本資訊,可以從第一行看出exp是基於11.2版本,第2行可以看出是基於使用者模式匯出的dump,如果是全庫模式會顯示為RENTIRE,表模式則為RTABLES,從第4行可以看出dump生成的時間戳等等。



如何得到dump中的表資訊 
對於dump檔案,我們可以解析出含有的表名,可以嘗試使用如下的方式來實現,使用strings,awk,sed結合可以很方便的完成這個功能。 

$ strings test.dump |grep "CREATE TABLE "|awk '{print $3}'|sed 's/"//g' 
BALL_DATA 
BIG_INSERT 
CLOB_TEST 
COUNTRY_LST 
CTEST 
DATA 
DATA2

 對於資料量小的dump檔案,這個方法非常有效,如果dump非常大,解析會稍稍有些慢,不過相比使用perl等方式解析,速度還是要快得多。
如何解析dump檔案生成parfile

在上面的基礎上,如果我們需要根據dump生成對應的parfile來做資料匯入匯出,可以使用如下的命令來解析dump生成parfile

$ strings n1_ddl.dump|grep "CREATE TABLE"|awk '{print $3}'|sed 's/"//g'|awk '{ if(FNR==1) print "tables="$1 ; else print ","$1}'
tables=BIG_INSERT
,CLOB_TEST
,DATA
,NEW_DATA
,OLD_DATA
,PAR_DATA
,RATED_EVENT
,SMALL_INSERT

   parfile對於使用exp/imp如虎添翼,可以使資料匯入匯出更加規範,很多細節都可以在parfile中靈活定義,可以使得exp/imp可讀性更強。

資料匯入匯出中的盲點

1:需要考慮的外來鍵影響
在匯入dump檔案的時候,外來鍵也是一個很重要的因素,可能dump中含有一些表,有些表中存在外來鍵,在資料遷移之類的專案中是很讓人頭疼的,你得基於外來鍵考慮表的匯入順序,有些表得先匯入,要不在資料插入的時候會報外來鍵相關的ORA問題。 
可以使用如下的指令碼來做一個基本過濾,可以考慮在過濾條件中嵌入一個dump中表的清單,可以更加精準的處理相關的外來鍵。可以使用如下的指令碼來動態生成對應的指令碼來禁用外來鍵。

SELECT

      'ALTER TABLE '||TABLE_NAME||' DISABLE  CONSTRAINT '|| CONSTRAINT_NAME||';' FROM USER_CONSTRAINTS WHERE

       CONSTRAINT_TYPE='R' UNION SELECT 'ALTER TABLE '||UCA.TABLE_NAME||' DISABLE  CONSTRAINT '|| UCA.CONSTRAINT_NAME||';'

FROM

       USER_CONSTRAINTS UCA ,

       (SELECT  CONSTRAINT_NAME

          FROM  USER_CONSTRAINTS

          WHERE CONSTRAINT_TYPE IN ('P','U')

) tmp

WHERE UCA.CONSTRAINT_TYPE = 'R'

  AND tmp.constraint_name = UCA.R_CONSTRAINT_NAME ;

生成的語句類似這樣的形式。

ALTER TABLE ADD_TARGET DISABLE  CONSTRAINT ADD_TARGET_1FK;

 務必注意在disable constraint,在完成資料匯入後,需要enable constraint的操作,就是把上面指令碼中的disable改為enable即可。

 

盲點2:需要考慮的觸發器影響
觸發器在資料匯入或者資料遷移中都會存在潛在的問題,如果你不瞭解應用中的觸發器處理細節,就會發現在資料匯入或者資料遷移的過程中,會莫名其妙多出來一部分資料,或者有些資料發生了變化。 
一般來說,可以和開發做簡單的確認,大多數的情況下都是需要把觸發器做disable操作,然後在資料匯入之後再啟用。

可以採用如下的指令碼:

SELECT

      'ALTER TRIGGER ' ||TRIGGER_NAME||' DISABLE ;'

FROM

       USER_TRIGGERS; 

個人在使用trigger的過程中碰到過一些問題,就是因為沒有注意到trigger的影響,結果本來表中含有100萬資料,需要匯入20萬,結果匯入後,發現總資料條數為130萬了,那多出來的10萬資料就是觸發器中的相關邏輯插入的資料。

盲點3buffer size的影響
buffer size的設定在資料匯入中也是很重要的,如果dump存在一個較大的分割槽表,很可能匯入的過程中就會跑出buffer size不夠的錯誤,給你的匯入工作帶來很多影響。 
一般可以把buffer size設定的大一些,比如4M9M都是不錯的選擇



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