Oracle通過資料泵網路匯入另一個資料庫,不產生DMP檔案
本文是記錄一次Oracle資料匯入的經曆,方便以後複習。因項目需要將伺服器A上的資料庫(使用者名稱:USER1)匯入到伺服器B上的資料庫(使用者名稱:USER1),不想採用普通的EMP /IMP方式,通過產生一個中間的DMP檔案來操作,記得資料泵EMP DP/IMPDP可以不用產生中間檔案直接將資料從一個資料庫匯入到另一個資料庫,於是找了些相關資料,指令碼如下:
impdp system/system@ORCLB network_link=db_a_user1 logfile=impdp_db_a_user1.log DIRECTORY=TEMP_A_USER1 parallel=8;
執行出錯,錯誤資訊如下:
LRM-00104: '32;' 不是 'parallel' 的合法整數
經過查看資料,說是parallel不能放在文法的最後面,於是調整後指令碼如下:
impdp system/system@ORCLB network_link=db_a_user1 logfile=impdp_db_a_user1.log parallel=8 DIRECTORY=TEMP_A_USER1;
再次執行,依然出錯,錯誤資訊如下:
經查閱資料,發現必須建立public dblink才可以,先刪除掉原有的dblink再重新建立,錯誤解決。
原來dblink指令碼:
CREATEDATABASELINKdb_a_user1
CONNECTTOUSER1IDENTIFIEDBYUSER1
USING
'(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.1)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ORCL)
)
)';
調整後指令碼:
CREATEPUBLICDATABASELINKdb_a_user1
CONNECTTOUSER1IDENTIFIEDBYUSER1
USING
'(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.1)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ORCL)
)
)';
但出現了新的錯誤資訊:
目錄(directory)TEMP_A_USER1無效,查閱資料發現需要將把DIRECTORY= TEMP_A_USER1放在指令碼前面,調整後指令碼如下:
impdp system/system@ORCLB DIRECTORY=TEMP_A_USER1 parallel=8 network_link=db_a_user1 logfile=impdp_db_a_user1.log;
再次執行,出現另外一個錯誤,錯誤資訊如下:
後經查看Dba_Directories發現TEMP_A_USER1建立問題,因伺服器B為AIX小機,可能是已有的TEMP_A_USER1對應的目錄無操作許可權,於是先刪除掉TEMP_A_USER1,重新再system使用者下建立TEMP_A_USER1,並授予UTL_FILE執行許可權。
CREATEDIRECTORYTEMP_A_USER1AS'/tmp';
GRANTREAD,WRITEONDIRECTORYTEMP_A_USER1TOsystem;
GRANTEXECUTEON SYS.UTL_FILE TOsystem;
再次執行指令碼
impdp system/system@ORCLB DIRECTORY=TEMP_A_USER1 parallel=8 network_link=db_a_user1 logfile=impdp_db_a_user1.log;
沒有出現錯誤,成功將資料從A伺服器匯入到B伺服器的資料庫中。
總結:從以上經曆可以看出,成功地通過網路匯入資料庫(不產生DMP檔案)需要注意以下內容:
1、 在B伺服器資料庫建立到A伺服器資料庫的public db link;
2、 在system下建立Directory,並賦予其讀寫權限,同時賦予SYS.UTL_FILE的執行許可權;
3、 執行指令碼參數位置,DIRECTORY=TEMP_A_USER1必須放在前面,parallel=8不能放在最後,是不是Oracle bug沒確定過。