【IMPDP】使用工具IMPDP导入数据时ORA-39002、ORA-39070错误排查

本文详细记录了使用IMPDP导入数据时遇到的一系列错误,包括ORA-39002、ORA-39070等,通过分析日志文件定位到问题在于数据库内的directory对象指向的目录路径与实际服务器上的路径不一致。最终通过重建directory对象解决了问题,避免了常见的权限错误陷阱。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

impdp导数据时的ORA-39002,: invalid operation,ORA-39070,ORA-29283等错误         


用expdp命令导入数据时,发现报如下错误:

 ORA-39002: invalid operation
 ORA-39070: Unable to open the log file.
 ORA-29283: invalid file operation
 ORA-06512: at "SYS.UTL_FILE", line 475
 ORA-29283: invalid file operation

看到这个错误后,先想到的权限的问题,以为是数据库内的directory的权限没有赋给相关的用户,但是经过查询后发现已经给相关的用户赋予了read,write权限了。折腾了很久后发现原来是由于在数据库内创建directory时有个字母写错了,而服务器上根本就没有这个目录,因此就报这个错误了。

解决办法就是要么删除directory重建,使其对应的目录和服务器一致,要么就是在服务器上创建和之前directory指定的目录一致。我通过重建directory后,顺利将数据导入。

参考:

http://space.itpub.net/519536/viewspace-664406


今天在使用IMPDP完成数据导入的过程中遇到“ORA-39002、ORA-39070……”连续报错。
导致问题原因很简单,但是提示的错误信息内容比较“诡异”,为了朋友们少走弯路,简单记录一下这个问题的处理过程。

1.问题再现
sec@secDB /db_backup/dpump_dir$ impdp sec/sec directory=dpump_dir dumpfile=20100604020437_sec.dmp logfile=impdp.log

Import: Release 10.2.0.3.0 - 64bit Production on Friday, 04 June, 2010 14:39:16

Copyright (c) 2003, 2005, Oracle.  All rights reserved.

Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit Production
With the Partitioning, OLAP and Data Mining options
ORA-39002: invalid operation
ORA-39070: Unable to open the log file.
ORA-29283: invalid file operation
ORA-06512: at "SYS.UTL_FILE", line 475
ORA-29283: invalid file operation

2.问题分析
这里的“ORA-39070”提到的“Unable to open the log file.”初看非常的“诡异”,到底无法打开什么日志文件呢?难道是没有权限在这个目录下写文件?经过“touch”测试排除了这种可能性。
不管怎么说,这个问题与文件操作相关。顺着这个思路继续前行,终于发现原来数据库中的directory数据库对象所指向的目录为“/oradata/dpump_dir”,而在该操作系统中根本没有这个目录,因目录不存在,日志文件也就理所当然的无处可写。

不过这个报错的信息却是不够明显,如果能够给出更多的检查和明确的报错信息就更好了。

sys@ora10g> col owner for a6
sys@ora10g> col DIRECTORY_NAME for a20
sys@ora10g> col DIRECTORY_PATH for a30
sys@ora10g> select * from dba_directories where DIRECTORY_NAME = 'DPUMP_DIR';

OWNER  DIRECTORY_NAME       DIRECTORY_PATH
------ -------------------- ------------------------------
SYS    DPUMP_DIR            /oradata/dpump_dir

3.问题处理
发现问题后,处理方法就简单了许多,只需要重新创建directory数据库对象即可。
sys@sec> drop directory dpump_dir;

Directory dropped.

sys@sec> create directory dpump_dir as '/db_backup/dpump_dir';

Directory created.

sys@sec> grant read, write on directory dpump_dir to public;

Grant succeeded.

4.导致该问题的潜在原因
在10g环境中即使在创建directory数据库对象的过程中即使所引用的目录不存在,该命令也是可以正常创建的,这就是容易误操作的根本原因。
sys@ora10g> create directory dpump_dir_test as '/sec/ool/er';

Directory created.

小心陷阱。

5.小结
从该问题的处理过程中我们可以看到,在报错信息不实很明显的时候我们往往手足无措。越是在这样的场景,我们越应该沉着冷静,从整个操作的源头一步一步的去排查,终有柳暗花明之时。

Good luck.

secooler
10.06.04

<think>我们正在解决用户的问题:如何在不使用SYSDBA角色的情况下,解决使用impdp导入数据出现的ORA-39070错误。 根据引用内容,ORA-39070错误通常与无法打开日志文件有关,而根本原因往往是目录对象权限不足或目录不存在。 用户要求不使用SYSDBA,因此我们需要通过授权普通用户来避免这个错误。 步骤: 1. 确保操作系统目录存在并且Oracle进程有读写权限(这一步通常需要DBA或系统管理员操作)。 2. 使用具有足够权限的用户(比如SYSDBA)创建目录对象并授权给普通用户(因为创建目录需要CREATE ANY DIRECTORY权限,普通用户没有,所以这一步需要SYSDBA先做,但之后的操作可以由普通用户完成)。 3. 确保普通用户对目录对象有读写权限。 4. 使用该普通用户执行impdp命令,并指定正确的目录和日志文件。 注意:用户要求不使用SYSDBA执行impdp,但创建目录和授权这一步需要SYSDBA(或具有CREATE ANY DIRECTORY权限的用户)来做。我们可以向用户说明,在准备阶段需要DBA协助,但之后的导入操作可以由普通用户完成。 具体步骤: 步骤1:由DBA(使用SYSDBA)创建物理目录(如果不存在)和目录对象。 步骤2:由DBA将目录对象的读写权限授予执行导入的普通用户。 步骤3:使用普通用户执行impdp,并确保在命令中指定了正确的目录和日志文件。 详细操作: 1. DBA创建操作系统目录并设置权限(以Linux为例): ```bash mkdir -p /u01/dpump_imports chown -R oracle:oinstall /u01/dpump_imports chmod -R 775 /u01/dpump_imports ``` 2. DBA登录数据库创建目录对象并授权: ```sql CREATE OR REPLACE DIRECTORY IMPDP_DIR AS '/u01/dpump_imports'; GRANT READ, WRITE ON DIRECTORY IMPDP_DIR TO import_user; -- 将import_user替换为实际执行导入的用户名 ``` 3. 使用普通用户(import_user)执行导入命令: ```bash impdp import_user/password@service_name DIRECTORY=IMPDP_DIR DUMPFILE=export.dmp LOGFILE=import.log ``` 注意:在导入命令中,我们指定了LOGFILE参数,这样日志文件就会写入到IMPDP_DIR目录中。如果未指定LOGFILE,则默认使用import.log,同样需要目录的写权限。 如果用户自己无法执行步骤1和2(因为需要SYSDBA权限),则需要向DBA申请创建目录并授权。 另外,如果用户已经创建了目录对象,但当前用户没有读写权限,也会出现ORA-39070错误。因此,确保当前用户对使用的目录对象有READ和WRITE权限。 验证权限的SQL(以普通用户身份连接后执行): ```sql SELECT privilege, directory_name FROM all_tab_privs WHERE table_name = 'IMPDP_DIR' AND grantee = 'IMPORT_USER'; ``` 如果权限不足,需要DBA执行授权: ```sql GRANT READ, WRITE ON DIRECTORY IMPDP_DIR TO import_user; ``` 总结:避免ORA-39070错误的关键是确保执行导入的普通用户对所使用的目录对象具有READ和WRITE权限,并且操作系统目录存在且Oracle进程可访问。 注意:在Oracle多租户环境中,如果导入到PDB,则需要在PDB中创建目录对象(或者在CDB中创建但需要授予PDB中的用户访问权限)。 因此,对于非SYSDBA用户,我们通过提前授权目录的读写权限,然后使用该用户执行impdp命令,即可避免ORA-39070错误。 相关问题: 1. 如何为Oracle普通用户创建目录对象? 2. 如何查看Oracle用户对目录对象的权限? 3. 在多租户环境中,如何为PDB中的用户授予目录权限? 4. 使用impdp导入如何指定日志文件? 5. 如何解决impdp导入中的权限问题? 注意:生成相关问题后,在回答中不需要显示相关问题,但需要按照要求生成。</think>### 解决非SYSDBA用户执行impdpORA-39070错误的方法 #### 🔍 错误原因分析 ORA-39070错误的本质是**目录对象权限不足**,具体表现为: 1. 执行用户对目录对象缺少`READ`/`WRITE`权限 2. 操作系统目录物理权限不足 3. 目录路径不存在或拼写错误 4. 日志文件命名冲突(如已存在只读文件) > 📌 关键点:即使不使用SYSDBA,只要正确配置目录权限即可解决[^1][^2] #### ✅ 解决方案(无需SYSDBA角色) ##### 步骤1:创建/验证操作系统目录 ```bash # 创建物理目录(需DBA或系统管理员操作) mkdir -p /u01/dpump_imports chown oracle:oinstall /u01/dpump_imports chmod 775 /u01/dpump_imports # 确保Oracle进程可读写 ``` ##### 步骤2:由DBA创建目录对象并授权 ```sql -- DBA执行(只需执行一次) CREATE DIRECTORY USER_IMPDP_DIR AS '/u01/dpump_imports'; GRANT READ, WRITE ON DIRECTORY USER_IMPDP_DIR TO import_user; -- 授权给操作账户 ``` ##### 步骤3:验证用户权限 ```sql -- 普通用户登录后执行 SELECT * FROM ALL_DIRECTORIES WHERE DIRECTORY_NAME='USER_IMPDP_DIR'; SELECT * FROM USER_TAB_PRIVS WHERE TABLE_NAME='USER_IMPDP_DIR'; -- 确认READ/WRITE权限 ``` ##### 步骤4:执行导入(关键参数) ```bash impdp import_user/password@PDBORCL \ DIRECTORY=USER_IMPDP_DIR \ DUMPFILE=export.dmp \ LOGFILE=impdp_$(date +%Y%m%d).log # 动态日志名避免冲突 ``` #### ⚠️ 注意事项 1. **日志文件处理** - 每次导入使用**新日志文件名**,避免覆盖只读文件 - 添加间戳:`LOGFILE=impdp_20240520.log` 2. **目录对象检查** - 确认`DIRECTORY`参数值与创建对象**完全一致**(大小写敏感) - 避免使用默认`DATA_PUMP_DIR`,其权限常受限制[^3] 3. **权限继承问题** ```sql -- 如果通过角色授权,需直接授权(角色权限对数据泵无效) GRANT READ ON DIRECTORY USER_IMPDP_DIR TO import_user; -- 直接授权 ``` #### 🛠️ 故障排除脚本 ```sql -- 检查目录有效性 SELECT DIRECTORY_NAME, DIRECTORY_PATH FROM DBA_DIRECTORIES WHERE DIRECTORY_NAME='USER_IMPDP_DIR'; -- 检查物理权限 !ls -ld /u01/dpump_imports # 在SQL*Plus中执行 -- 强制释放目录锁 ALTER SYSTEM KILL SESSION 'sid,serial#'; -- 当目录被占用 ``` #### 💡 替代方案:使用DBMS_DATAPUMP API 通过PL/SQL避免命令行权限问题: ```sql DECLARE dp_handle NUMBER; BEGIN dp_handle := DBMS_DATAPUMP.OPEN( operation => 'IMPORT', job_mode => 'SCHEMA' ); DBMS_DATAPUMP.ADD_FILE( handle => dp_handle, filename => 'export.dmp', directory => 'USER_IMPDP_DIR', filetype => DBMS_DATAPUMP.KU$_FILE_TYPE_DUMP_FILE ); DBMS_DATAPUMP.START_JOB(dp_handle); END; / ``` > **最佳实践**: > 1. 为每个项目创建专用目录对象 > 2. 导入前执行预检:`impdp ... SQLFILE=precheck.sql` > 3. 定期清理旧日志文件:`!rm /u01/dpump_imports/impdp_*.log` 通过以上配置,普通用户无需SYSDBA权限即可完成导入,同满足企业安全合规要求[^2][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值