ORA-39083,ORA-02298错误一则

问题:
在使用impdp工具导从生产环境导入到测试环境数据时,导入过程最后出现下面的错误:
impdp system/******** directory=DIR_1 network_link=link_5237 schemas=NTICKET logfile=imp237_120703.log 

ORA-39083: 对象类型 REF_CONSTRAINT 创建失败, 出现错误:
ORA-02298: 无法验证 (NTICKET.TK_ITINERARY_PRN_FK2) - 未找到父项关键字
失败的 sql 为:
ALTER TABLE "NTICKET"."TK_ITINERARY_PRN_DT" ADD CONSTRAINT "TK_ITINERARY_PRN_FK2" FOREIGN KEY ("TKT_ID") REFERENCES "NTICKET"."TK_ORDER_TICKET_DT" ("ID") ENABLE

 

分析原因:
从错误信息看是因为违反了外键约束所至,但为什么出现这种情况呢?
--检查数据
SQL> Select TKT_ID From NTICKET.TK_ITINERARY_PRN_DT
  2  Minus
  3  Select ID From NTICKET.TK_ORDER_TICKET_DT;

TKT_ID
----------------------------------------
8a81858c384b801701384d3b4af90a3b
8a81858c384b801701384d3b4afb0a3d
8a81858c384b801701384d3bf1550a46

发现主表中有外键表中不存在的外键值。

因为数据从生产环境导过来的,导入时间用了近1小时,而数据表的导入顺序是按表的由大到小导入的。在这过程中如果先导入外键表数据,再经过一段时间后,再导入主表数据。如果这段时间经过的时间比较长,就会有可能出现主表和外键表数据不一致的情况。就像前面所说的主表中有外键表中不存在的外键值。

解决办法:
1.如果允许,在导入前先把生产环境用户进行锁定。
Alter User nticket Account Lock;

2.或是在导入时加上FLASHBACK_SCN参数,保证数据导入的一致性。

你可能感兴趣的:(ORA-39083,ORA-02298错误一则)