正式环境的数据库数据备份后恢复到测试环境,然后报错system Error,找外包公司的技术看了以后给出一个impdp参数,transform=oid:N
之前的备份计划一直是这样的
每天凌晨一点备份数据库。
~]$ crontab -l
0 1 * * * /home/oracle/oracle_back.sh
30 2 * * * /home/oracle/clear_archivelog.sh
/home/oracle/app/11.2.0/db_1/bin/expdp XXX/XXX@XXX directory=BAKUP_DIR dumpfile=$BAKUPTIME.dmp logfile=$BAKUPTIME.log
后来在Web服务器上加了一个计划任务
~]# crontab -l
59 0 * * * /usr/weaver/Resin/bin/stopresin.sh >/dev/null 2>&1
59 1 * * * /usr/weaver/Resin/bin/startresin.sh >/dev/null 2>&1
重启resin服务的计划,为什么呢?因为之前都是不停服务备份,然后将备份数据恢复到测试数据库后会有问题,售后支持说是因为备份时服务在线导致插入数据前后不一致,对数据库不熟,只知道备份时会自动锁表或者设置表为只读状态,应该不会出现不一致啊,但是他一口咬定确实会不一致,所以就在备份数据时停止运行服务,此服务是公司内部人员使用,所以没有多大问题。
今天开发又需要同步测试的数据库了,所以就恢复了一份最新备份数据,结果...
- 修改前的导入命令
impdp XXX/XXX directory=OA dumpfile=2018-04-28.dmp logfile=import${Time}.log TABLE_EXISTS_ACTION=REPLACE REMAP_SCHEMA=XXX:XXX2
然后找到了外包技术支持,给了文章开头这个参数
- 修改后的导入命令
impdpXXX/XXX directory=OA dumpfile=2018-04-28.dmp logfile=import${Time}.log TABLE_EXISTS_ACTION=REPLACE REMAP_SCHEMA=XXX:XXX2 transform=oid:N
回归正题
网上查了下这个参数的用法
原文链接
-
出错原因
一用户所有对象导出后导入到同一数据库的不同用户,因为该用户创建了type和定时任务,在同一数据库中,OID和job id是唯一的,所以在导入的时候报如下错误,创建type失败和创建job失败了 importing LHF 's objects into LHF2IMP-00017……(我之前在测试创建过和正式环境一样的用户,现在这个是另一个) -
参数说明:
大意就是说如果TRANSFORM参数设置成OID=N,表示在imp的时候,新创建的表或这个类型会赋予新的OID,而不是dmp文件中包含的OID的值。但是这个参数的默认值是OID=Y,因此在进行Imp的时候,新创建的表或者type会赋予同样的OID,如果是位于同一个数据库上的不同schema,那就会造成OID冲突的问题,因此解决这个问题也很简单,只需要在impdp的时候,显示设置transform 参数为OID=N既可以了。如下所示,
cmd> impdp test/test directory=dump_dir dumpfile=dump.dmp logfile=dump.log remap_schema=frank:test transform=OID:N
网友评论