1. 程式人生 > 其它 >淺談exp/imp(下) (r5筆記第84天)

淺談exp/imp(下) (r5筆記第84天)

相關連結:淺談exp/imp(上) (r5筆記第81天)

你可能 不瞭解的dump檔案

在工作中,dump檔案對於dba而言是再平常不過的檔案了。不過因為dump檔案是二進位制檔案,所以大家可能在平時使用中也不太關注,不過儘管如此,在匯入dump檔案的時候還是有很多的細節和技巧值得注意,可以避免一些不必要的問題。 如何檢視dump檔案的一些基本資訊 當你拿到一個dump檔案的時候,不能盲目匯入,我們可以基於當前的dump檔案作一些基本的檢查。 比如我們可以查到dump檔案匯出的版本,時間,匯出的使用者。 儘管dump檔案是二進位制檔案,但是我們還是可以使用strings來得到一些資訊。

$ strings test.dmp|head -10 
iEXPORT:V11.02.00 
RUSERS 
8192 
Sun Dec 28 6:54:27 2014test.dmp 
#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.dmp |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.dmp|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萬資料就是觸發器中的相關邏輯插入的資料。

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