BEAUTYBB 2014-09-20
本文是记录一次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没确定过。