淺談exp/imp(下)
你可能 不瞭解的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萬資料就是觸發器中的相關邏輯插入的資料。
盲點3:buffer size的影響
buffer size的設定在資料匯入中也是很重要的,如果dump存在一個較大的分割槽表,很可能匯入的過程中就會跑出buffer
size不夠的錯誤,給你的匯入工作帶來很多影響。
一般可以把buffer size設定的大一些,比如4M,9M都是不錯的選擇。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-1718314/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 淺談exp/imp(上)
- exp/imp工具
- Oracle imp/expOracle
- 【EXP/IMP】使用EXP /IMP工具“模糊”匯出和匯入
- oracle exp和impOracle
- oracle imp和expOracle
- exp imp資料
- oracle exp imp 用法Oracle
- EXP&IMP PIPE
- 【exp/imp不同版本】Oracle不同版本的exp/imp使用注意事項Oracle
- exp和imp詳解
- exp/imp命令詳解
- exp/imp工具的使用
- IMP和EXP筆記筆記
- EXP/IMP 學習(五)
- EXP/IMP 學習(四)
- EXP/IMP 學習(三)
- EXP/IMP 學習(二)
- EXP/IMP 學習(一)
- EXP/IMP 學習(六)
- exp_imp實戰
- Oracle的exp/imp詳解Oracle
- exp,imp 遷移資料
- imp/exp資料遷移
- oracle exp_imp小記Oracle
- 大表exp/imp遷移
- imp/exp命令 詳解(1)
- 理解exp, imp 使用direct=y 及imp commit=yMIT
- ORACLE exp/imp匯入報錯IMP-00009&IMP-00028&IMP-00015Oracle
- exp,imp相關工具說明
- RMAN與exp / imp的區別
- expdp\impdp及exp\imp 詳解
- Oracle Exp/Imp常見問題Oracle
- 轉:Exp/Imp工具效能調優
- 老外的EXP&IMP總結
- exp和imp的詳細操作
- 24.EXP和IMP(筆記)筆記
- imp/exp 字符集轉換