Oracle导入报错ORA-39002与ORA-39166的原因排查
解决ORA-39002和ORA-39166的导入错误
从你的导出和导入日志来看,问题的根源非常明确——导入命令没有正确指定导出表的所属schema,导致Oracle找不到要导入的对象。
错误原因分析
你用expdp导出的是BANK用户下的4张表:BANK.EMPLOYEE、BANK.TRANSACTION、BANK.BRANCH、BANK.ACCOUNT,但执行impdp时用的是DWH用户,并且直接写了tables=employee,transaction,branch,account。这时候Oracle会默认去查找DWH用户名下的这些表,而dump文件里根本没有DWH的这些表,自然就抛出了ORA-39166(对象未找到),进而触发ORA-39002(无效操作)。
解决方案
根据你的需求,分两种情况处理:
情况1:要把表导入到DWH用户下(变更所属schema)
需要用REMAP_SCHEMA参数将原schema(BANK)映射到目标schema(DWH),同时明确指定dump文件中的表所属schema:
impdp dwh/d123 tables=BANK.employee,BANK.transaction,BANK.branch,BANK.account directory=my_dir dumpfile=tables_dump.dmp logfile=tables_import.log remap_schema=BANK:DWH
REMAP_SCHEMA=BANK:DWH:告诉Oracle把dump文件里BANK的对象全部导入到DWH用户下- 明确写
BANK.employee:避免Oracle误解为当前用户(DWH)的表
情况2:要把表导入回原BANK用户下
直接用BANK用户执行导入命令即可,不需要额外参数:
impdp bank/b123 tables=employee,transaction,branch,account directory=my_dir dumpfile=tables_dump.dmp logfile=tables_import.log
如果必须用DWH用户来导入到BANK schema,需要确保DWH用户拥有IMP_FULL_DATABASE角色,并且命令中指定原schema的表:
impdp dwh/d123 tables=BANK.employee,BANK.transaction,BANK.branch,BANK.account directory=my_dir dumpfile=tables_dump.dmp logfile=tables_import.log
额外验证步骤
如果你不确定dump文件里的对象归属,可以用SQLFILE参数先导出dump文件中的DDL,查看表的所属schema:
impdp dwh/d123 directory=my_dir dumpfile=tables_dump.dmp sqlfile=dump_content.sql
打开dump_content.sql就能看到所有对象的完整名称,确认它们属于BANK用户。
内容的提问来源于stack exchange,提问作者Learner
相关产品推荐
相关产品推荐

