f Oracle DATAPUMP impdp network_link 所碰到的問題 ~ 迪貝之家

Pages

Oracle DATAPUMP impdp network_link 所碰到的問題

由18c 透過impdp 經由network_link及啟用parallel移轉12.1資料時,就發覺怎麼好像在index的部份很慢,叫起top畫面,怎麼會只有一個server process在運作,到metalink查詢文件,發現底下這篇文件
DataPump Import Does Not Use Multiple Parallel PX Processes For Index Creation (Doc ID1081069.1)

文件內的說法

Bug 8604502
但我的環境是18c,再加上打了2019年第一季的RU,怎麼還會發生這個問題。所以我就開了一個call給global support,結果居然問我碰到了甚麼問題?我真的是發覺,中國大陸的support實在是有點........。心裡就想,連這個錯也會犯,Oracle真的是新版出的太快了。算了,還是自己改變匯入的方式,把data與index匯入分開

首先當然再12.1的環境把index 定義萃取出來

expdp system/xxx content=metadata_only dumpfile=index.dmp log=expdp.log directory=data_pump_dir include=INDEX,constraint SCHEMAS=test1,test2,test3
接著把定義匯出檔轉為sql 語法


我們來看其中一段萃取出來的索引建立語法

impdp system/xxx dlogfile=index.logirectory=data_pump_dir dumpfile=index.dmp sqlfile=index.sql 

CREATE INDEX "TEST"."BACKWARD_ITEM_IDX2" ON "TEST"."BACKWARD_ITEM" ("TEMPLATE_DATE", "ITEM", "PERIOD")
PCTFREE 10 INITRANS 2 MAXTRANS 255
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "TEST_INDEX"
PARALLEL 1 ;
ALTER INDEX "TEST"."BACKWARD_ITEM_IDX2" PARALLEL 4;

也許你會認為會不會是只有這個index原本定義的問題,所以我用下列語法去掃create時使用的parallel 參數

grep -i parallel index.sql|grep -i TABLESPACE|more
確定轉出來的都是PARALLEL 1,datapump 是在索引建立出來之後,再透過alter index把原來的PARALEL 參數設上
也許你還會質疑,會不會是expdp或者impdp沒有帶parallel參數,兩者我都帶過parallel=8測過,狀況一樣。所以如果要加快資料移轉的速度,索引與資料的匯入要切開。再來就是直接打開index.sql修改PARALLEL 後的數值,你當然要去比對表格大小來設定該數值。我能說甚麼?Oracle 想要凸顯DBA的價值.....
我們來看我怎麼進行資料匯入的語法
impdp system/xxx network_link=temp_nwds log=nwds_impdp_0508.log directory=nwds_impdp full=y parallel=16 EXCLUDE=SCHEMA:\"IN \(\'MONITOR\'\,\'SQLTXPLAIN\'\,\'SQLTXADMIN\'\,\'WMSYS\'\,\'I3AGENT\'\,\'SYSTEM\'\,\'SYS\'\,\'OLAPSYS\'\,\'SI_INFORMTN_SCHEMA\'\,\'AUDSYS\'\,\'GSMUSER\'\,\'ORDPLUGINS\'\,\'SPATIAL_WFS_ADMIN_USR\'\,\'SPATIAL_CSW_ADMIN_USR\'\,\'XDB\'\,\'SYSDG\'\,\'DIP\'\,\'OUTLN\'\,\'ANONYMOUS\'\,\'CTXSYS\'\,\'ORDDATA\'\,\'SYSBACKUP\'\,\'MDDATA\'\,\'GSMCATUSER\'\,\'GSMADMIN_INTERNAL\'\,\'SYSKM\'\,\'XS\$NULL\'\,\'OJVMSYS\'\,\'APPQOSSYS\'\,\'ORACLE_OCM\'\,\'WMSYS\'\,\'DBSNMP\'\,\'ORDSYS\'\,\'MDSYS\'\)\" exclude=INDEX,constraint REMAP_TABLESPACE=TEST1:DATA REMAP_TABLESPACE=TEST2:DATA 
最後當然就是執行修改過後的index.sql