执行impdp时遇ORA-00904错误:排除DB_LINK导致导入失败求因
我尝试将ORIG模式导入至TEST模式,ORIG模式的导出文件为exp_orig.dmp。执行的impdp命令及引用的参数文件如下:
执行命令
impdp TEST/123@TESTDB parfile=imp_testdb.par
参数文件imp_testdb.par内容
remap_schema=ORIG:TEST dumpfile=exp_orig.dmp logfile=imp_test.log directory=ORA_IMPROT logtime=ALL metrics=YES exclude=DB_LINK table_exists_action=REPLACE
报错信息
ORA-39068: invalid master table data in row with PROCESS_ORDER=-13
ORA-00904: "TAG": invalid identifier
排查步骤
- 导入至同规格新用户仍报错,排除目标模式问题;
- 重新导出ORIG模式后导入仍报错,排除dump文件问题;
- 移除
exclude=DB_LINK参数后导入成功。
请问该问题可能的原因是什么?
版本兼容性差异:如果导出
exp_orig.dmp所用的expdp版本和执行导入的impdp版本不一致,在处理exclude=DB_LINK参数时,Data Pump内部的元数据结构会出现不匹配。报错中的"TAG"字段属于高版本Data Pump的元数据字段,低版本导出的dump文件中不存在该字段,高版本impdp尝试读取时就会抛出ORA-00904错误,进而触发主表数据无效的ORA-39068报错。特定Oracle版本的Data Pump Bug:在部分Oracle版本中,当同时使用
remap_schema和exclude=DB_LINK进行跨模式导入时,Data Pump的主表生成逻辑存在缺陷。排除数据库链接对象的操作会触发内部SQL错误引用不存在的TAG列,导致SQL执行失败,最终引发主表数据无效的报错。这类Bug通常只在特定版本组合或参数搭配下出现,移除exclude=DB_LINK参数后就会避开这个逻辑漏洞。隐性依赖处理冲突:数据库链接对象可能与模式内其他对象存在隐性依赖关系(比如某些存储过程、视图间接引用了DB_LINK),当使用
exclude=DB_LINK排除它时,Data Pump在处理依赖关系的过程中,内部构造的SQL语句错误地引用了TAG字段。而完整导入所有对象时,Data Pump的依赖处理逻辑不会触发这个错误的SQL生成。
内容的提问来源于stack exchange,提问作者unciahan

