You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Oracle 12c IMPDP导入报错求助:ORA-39002与ORA-39166问题

解决Oracle impdp导入时的ORA-39002和ORA-39166错误

针对你遇到的impdp导入报错,我先梳理下问题场景,再一步步给出排查和解决方法:

你的导入命令与错误信息

执行的导入命令:

impdp user/password DIRECTORY=desktop_import DUMPFILE=SENIORS4_Feb1.dmp TABLES=(DOCUMENT_PUBLISH, MEDIA_APPLICANT) REMAP_TABLESPACE=SENIORDB:import_user REMAP_SCHEMA=SENIORDB:import_user

触发的错误:

Connected to: Oracle Database 12c Standard Edition Release 12.2.0.1.0 - 64bit Production
ORA-39002: invalid operation
ORA-39166: Object IMPORT_USER.MEDIA_APPLICANT was not found or could not be exported or imported.
ORA-39166: Object IMPORT_USER.DOCUMENT_PUBLISH was not found or could not be exported or imported.

虽然你怀疑和日志文件创建有关,但ORA-39166更常见的根源是dump文件内容不匹配、表名问题或权限配置错误,下面是具体的排查步骤:


1. 先确认dump文件里是否存在目标表

首先要验证你的SENIORS4_Feb1.dmp中是否包含原用户SENIORDB下的DOCUMENT_PUBLISHMEDIA_APPLICANT表(因为你用了REMAP_SCHEMA将原schema映射到import_user)。

可以用impdpSQLFILE参数生成dump文件的DDL内容,方便查看:

impdp user/password DIRECTORY=desktop_import DUMPFILE=SENIORS4_Feb1.dmp SQLFILE=check_dump_content.sql

打开生成的check_dump_content.sql,搜索这两个表名。如果dump文件里根本没有这两个表,要么换正确的dump文件,要么去掉TABLES参数导入整个schema。

2. 检查表名的大小写匹配问题

Oracle默认会把未加双引号的表名转成大写,但如果原表是用双引号创建的小写/混合大小写表,那你必须在TABLES参数里用双引号包裹完整的表名(包括原schema):

# Linux环境下的写法
impdp user/password DIRECTORY=desktop_import DUMPFILE=SENIORS4_Feb1.dmp TABLES='("SENIORDB.DOCUMENT_PUBLISH", "SENIORDB.MEDIA_APPLICANT")' REMAP_TABLESPACE=SENIORDB:import_user REMAP_SCHEMA=SENIORDB:import_user

# Windows环境下的写法
impdp user/password DIRECTORY=desktop_import DUMPFILE=SENIORS4_Feb1.dmp TABLES=("SENIORDB.DOCUMENT_PUBLISH", "SENIORDB.MEDIA_APPLICANT") REMAP_TABLESPACE=SENIORDB:import_user REMAP_SCHEMA=SENIORDB:import_user

3. 验证REMAP参数的正确性

  • 检查目标表空间是否存在:你的REMAP_TABLESPACE=SENIORDB:import_user中,import_user是目标表空间名,先确认它存在:
    SELECT tablespace_name FROM dba_tablespaces;
    
    如果不存在,先创建目标表空间:
    CREATE TABLESPACE import_user DATAFILE '/u01/app/oracle/oradata/ORCL/import_user.dbf' SIZE 100M AUTOEXTEND ON NEXT 10M;
    
  • 检查目标用户权限REMAP_SCHEMA=SENIORDB:import_user要求import_user用户存在,且有足够的建表权限:
    GRANT CREATE SESSION, CREATE TABLE, UNLIMITED TABLESPACE TO import_user;
    

4. 确认目录与文件的操作系统权限

确保desktop_import对应的操作系统目录,Oracle用户(通常是oracle)有读写权限:

  • 先查目录对应的物理路径:
    SELECT directory_name, directory_path FROM dba_directories WHERE directory_name='DESKTOP_IMPORT';
    
  • 然后在操作系统层面检查权限(以Linux为例):
    ls -l /path/to/desktop_import/
    
    确保oracle用户对该目录和SENIORS4_Feb1.dmp文件有读权限,对目录有写权限(用于生成日志)。

5. 针对日志文件的排查(对应你的怀疑)

如果确实是日志无法创建导致的错误,可以显式指定日志文件名,强制Oracle生成日志:

impdp user/password DIRECTORY=desktop_import DUMPFILE=SENIORS4_Feb1.dmp TABLES=(DOCUMENT_PUBLISH, MEDIA_APPLICANT) REMAP_TABLESPACE=SENIORDB:import_user REMAP_SCHEMA=SENIORDB:import_user LOGFILE=seniors_import.log

如果此时报错提示无法创建日志文件,说明目录没有写权限,需要调整操作系统目录权限,或者换一个有写权限的Oracle目录。

6. 简化命令排查问题

如果以上步骤都没问题,可以先去掉TABLES参数,尝试导入整个SENIORDBschema到import_user

impdp user/password DIRECTORY=desktop_import DUMPFILE=SENIORS4_Feb1.dmp REMAP_TABLESPACE=SENIORDB:import_user REMAP_SCHEMA=SENIORDB:import_user

如果整个schema能成功导入,再单独导入这两个表,大概率是表名的细微拼写或大小写问题导致的。


内容的提问来源于stack exchange,提问作者John Faig

火山引擎 最新活动