在server2008 上进行impdp引发的血案(ORA-39070)

本文详细介绍了在使用Oracle 11g进行数据导入时遇到的问题,包括目录创建、权限设置及操作系统权限限制的影响,并提供了解决方案。主要关注了如何在Server 2008环境下正确配置数据库目录和权限,以确保数据导入过程顺利进行。

操作系统 : server 2008

O/S User : 非administrator

DB version: oracle 11g

 

 

操作步骤:

 1.创建目录:d:\dump_dir

 2.以system用户登录db,并创建directory

     create directory dumpdir as; (注意:此时oracle并不做目录有效性检查)

3.copy dump文件到目录 'd:\dump_dir'

4.执行导入:

expdp test/test@db dumpfile=tables.dmp directory=dumpdir  logfile=n job_name=exptab parallel=4

5.报错

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

6.查询dba_directories, dumpdir对象存在。感觉有些奇怪

7. 查看文件夹'd:\dump_dir'的权限,为只读,改为读写时报没有权限更改的错误。

8.从dba_directories查询出oracle自建的directory对象,例如:DATA_DUMP_DIR, 并将dump文件copy到该目录下

9. 再导入,用DATA_DUMP_DIR

expdp test/test@db dumpfile=tables.dmp directory=DATA_DUMP_DIR logfile=n job_name=exptab parallel=4

  导入成功,但报很多oRA-39111错误,这些错误似乎是正常的:

RA-39111: Dependent object type TRIGGER:"TAICHI_SCHEMA"."KNTA_PARAMETER_SET_FIELDS_TRIG" skipped, base object type VIEW:"TAICHI_SCHEMA"."KNTA_P
DS" already exists

 

总结原因:可能是操作系统权限的限制导致oracle无法在d:\dump_dir 下创建log文件。本人对server 2008不是很熟,所以只能猜测:server 2008可能也有个selinux一样变态的权限控制。

 

 

 


 

<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]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值