解决ORA-39166: Object CCXE.RR_JYRESEARCHREPORT was not found错误

解决Oracle数据库导入DMP文件时ORA-39166错误
在尝试将DATA_ONLY模式导出的Oracle表RR_JYRESEARCHREPORT导入到CCXE用户下的CCXE表空间时遇到ORA-39166错误。错误原因是DMP文件中的表信息仍关联原用户和表空间。通过使用impdp命令的REMAP_SCHEMA和REMAP_TABLESPACE参数,将表的所有权和表空间映射到目标用户和表空间,成功解决了问题。

OS环境:linux 5.4

数据库版本:oracle 11.2.0

 

今天同事给我两个DMP文件,是以DATA_ONLY模式导出的表,然后要我导入到CCXE用户下的CCXE表空间下,我的导入命令如下

 

impdp ccxe/****@FI directory=king DUMPFILE=RR_JYRESEARCHREPORT.DMP tables='(RR_JYRESEARCHREPORT)' job_name=king

Import: Release 11.2.0.1.0 - Production on Mon May 16 20:45:34 2011

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
ORA-39002: invalid operation
ORA-39166: Object CCXE.RR_JYRESEARCHREPORT was not found.

 

导入的过程中有报错信息,提示内容是找不到CCXE用户下RR_JYRESEARCHREPORT这个表,开始我以为是directory的设置问题,但是我重建directory后依然报错,最后通过使用metalink的查询,该报错的意思是dmp文件内无法找到属于CCXE用户下CCXE.RR_JYRESEARCHREPORT表,通过和同事沟通,最后才得知该表是从TRANUSER用户下TRANUSER表空间内导出的,找到瓶颈了。看来虽然数据是以DATA_ONLY模式导出的,但是数据内依然记得自己所属的是哪个表空间和用户,如果想解决该问题,需要使用参数REMAP重新定义该表的所属用户和所属表空间,命令如下,执行该命令,导入成功。

 

impdp ccxe/****@FI DIRECTORY=KING DUMPFILE=RR_JYRESEARCHREPORT.DMP    TABLES='(TRANUSER.RR_JYRESEARCHREPORT)' REMAP_SCHEMA=TRANUSER:CCXE REMAP_TABLESPACE=TRANUSER:CCXE job_name=king0516

 

Import: Release 11.2.0.1.0 - Production on Mon May 16 22:31:07 2011

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Master table "CCXE"."KING0516" successfully loaded/unloaded
Starting "CCXE"."KING0516":  ccxe/********@FI DIRECTORY=KING DUMPFILE=RR_JYRESEARCHREPORT.DMP TABLES=(TRANUSER.RR_JYRESEARCHREPORT) REMAP_SCHEMA=TRANUSER:CCXE REMAP_TABLESPACE=TRANUSER:CCXE job_name=king0516
Processing
object type TABLE_EXPORT/TABLE/TABLE_DATA
. . imported "CCXE"."RR_JYRESEARCHREPORT"                75.77 GB  235122 rows
Job "CCXE"."KING0516" successfully completed at 07:10:50

 

### Oracle UTL_FILE ORA-29289: Directory Access Denied 错误原因与解决方法 Oracle 的 `UTL_FILE` 包用于在 PL/SQL 中实现对操作系统文本文件的读写操作,但其使用受到目录权限的严格限制。当执行存储过程调用 `UTL_FILE.FOPEN` 打开文件时,若出现 `ORA-29289: directory access denied` 错误,表明当前用户没有访问指定目录的权限。 在 Oracle 中,`UTL_FILE` 的访问路径可以通过两种方式配置: - 通过 `UTL_FILE_DIR` 参数指定目录(不推荐,已逐步被弃用) - 创建 `DIRECTORY` 对象并授予特定用户访问权限(推荐方式)[^2] #### 错误原因分析 - **未正确创建 DIRECTORY 对象**:Oracle 会检查 `ALL_DIRECTORIES` 视图中是否存在指定的目录对象。如果未创建对应的 `DIRECTORY`,则会报错 `ORA-29283: invalid file operation`,进而导致 `ORA-29289` 权限问题[^3]。 - **权限未授予**:即使创建了 `DIRECTORY` 对象,若未对执行存储过程的用户授予 `READ` 或 `WRITE` 权限,则会触发 `ORA-29289` 错误- **操作系统权限问题**:Oracle 的数据库进程需要对目标文件系统目录具有实际的读写权限。如果操作系统权限配置不当,也会导致文件操作失败[^3]。 #### 解决方法 ##### 1. 创建 DIRECTORY 对象 确保在数据库中创建了指向目标操作系统的目录对象。例如: ```sql CREATE OR REPLACE DIRECTORY my_dir AS '/u01/app/oracle/files'; ``` 执行完成后,可以通过以下语句确认目录是否创建成功: ```sql SELECT * FROM ALL_DIRECTORIES WHERE DIRECTORY_NAME = 'MY_DIR'; ``` ##### 2. 授予用户访问权限 为执行存储过程的用户授予对目录的读写权限: ```sql GRANT READ, WRITE ON DIRECTORY my_dir TO your_user; ``` ##### 3. 检查操作系统目录权限 确保 Oracle 数据库进程运行的用户(如 `oracle` 用户)对 `/u01/app/oracle/files` 目录具有读写权限。可以通过以下命令检查并修改权限: ```bash ls -ld /u01/app/oracle/files chmod 755 /u01/app/oracle/files chown oracle:oinstall /u01/app/oracle/files ``` ##### 4. 示例存储过程 以下是一个使用 `UTL_FILE` 的存储过程示例: ```sql CREATE OR REPLACE PROCEDURE write_to_file IS file_handle UTL_FILE.FILE_TYPE; BEGIN file_handle := UTL_FILE.FOPEN('MY_DIR', 'test.txt', 'w'); UTL_FILE.PUT_LINE(file_handle, 'This is a test line.'); UTL_FILE.FCLOSE(file_handle); EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Error: ' || SQLERRM); IF UTL_FILE.IS_OPEN(file_handle) THEN UTL_FILE.FCLOSE(file_handle); END IF; RAISE; END; ``` 执行前确保 `DBMS_OUTPUT` 已启用,并以具有目录权限的用户执行。 --- ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值