本文是記錄一次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沒確定過。