本文是记录一次Oracle数据导入的经历,方便以后复习。因项目需要将服务器A上的数据库(用户名:USER1)导入到服务器B上的数据库(
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脚本:
db_a_user1
USER1
USING
'(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.1)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ORCL)
)
)';
调整后脚本:
db_a_user1
USER1
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;
再次执行,出现另外一个错误,错误信息如下:
TEMP_A_USER1
SYS.UTL_FILE
再次执行脚本
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、db link;
2、 在system下创建Directory,并赋予其读写权限,同时赋予SYS.UTL_FILE的执行权限;
3、 执行脚本参数位置,DIRECTORY=TEMP_A_USER1必须放在前面,parallel=8不能放在最后,是不是Oracle bug没确定过。