ORA-39181: Only partial table data may be exported due to fine grain access control on "OE"."PURCHAS

      操作环境:Oracle Linux 6.5+Oracle11g

      今天在用数据泵导出表空间的实验中出现一个错误:ORA-39181: Only partial table data may be exported due to fine grain access control on  第一次遇到这个错误,从Oracle 11g的官方文档Oracle® Database Error Messages 11g Release 2 (11.2) (编号E17766-03)一书中查到如下错误描述:

     ORA-39181: Only partial table data may be exported due to fine grain access control on string

Cause: An unprivileged user has tried to export a table that has fine grain access control. The table owner is subjected to access control and may not be able to export all rows in the table. Only the rows that can be seen by that user will be exported. In order to preserve integrity of the table, the user importing the table should have enough privilege to recreate the table with the security policies at import time.

Action: It is strongly recommended that the database administrator handle exporting of this table.
 
错误的原因是一个没有权限的用户试图导出一个具有细粒度访问控制的表。该表的拥有者访问该表会受限,因此不能导出该表里的所有行。该表的所有者只能导出其能看到的那些表行。因此,要保证表的完整性,在安全策略的前提下导入该表时,导入该表的用户必须拥有足够的权限来重建该表。


        解决的办法就是将EXEMPT ACCESS POLICY这个权限赋给system用户:


       


       虽然之前的导出有错误,但同样会生成导出的数据文件和日志文件,将其删除,再重复一次命令:




     成功!

   最后还有一句,导出的时候数据库是要处于open状态,数据库处于close、nomount、mount都无法导出的。


<think>首先,用户的问题是关于Oracle数据库导入错误,具体错误代码是:ORA-39002, ORA-31694, ORA-02354, ORA-04063。用户提到主表加载失败、数据导出导入错误和视图错误。我需要根据提供的引用内容来帮助解决。 回顾引用内容: - 引用[1]:涉及ORA-39002和ORA-39070,错误是无法打开日志文件,原因是目录路径大小写问题或文件夹不存在。 - 引用[2]:涉及ORA-39002和ORA-31694,错误是主表加载/卸载失败,文件无法打开,可能是文件大小问题。 - 引用[3]:涉及ORA-39002和ORA-39165,错误是未找到方案,解决方法是使用remap_schema和remap_tablespace。 - 引用[4]:涉及ORA-39002和ORA-39070,但未指定具体内容。 用户的具体错误包括ORA-31694(主表加载失败)、ORA-02354(可能是导入时错误)和ORA-04063(视图错误)。ORA-02354和ORA-04063没有在引用中直接提到,所以我需要基于一般知识处理。 关键错误分析: - **ORA-39002: 操作无效**:这是一个通用错误,通常由其他错误引起,如文件访问问题或参数错误。 - **ORA-31694: master table failed to load/unload**:导出/导入过程中主表处理失败,可能由于文件损坏、权限问题或路径错误。 - **ORA-02354: error in exporting/importing data**:数据导出/导入错误,可能涉及数据不一致或损坏。 - **ORA-04063: view has errors**:视图有错误,可能在导入后视图编译失败。 用户提到“主表加载失败”,这对应于ORA-31694;“数据导出导入错误”对应于ORA-02354;“视图错误”对应于ORA-04063。 基于引用,解决步骤: 1. **检查目录路径和权限**(如引用[1]):确保导出/导入使用的目录存在,大小写匹配(在Windows上),并且Oracle用户有读写权限。 2. **处理主表加载失败**(如引用[2]):检查dump文件是否完整,文件大小是否正常(逻辑块大小问题),确保文件可访问。 3. **方案和表空间映射**(如引用[3]):如果导出用户和导入用户不同,使用remap_schema;如果表空间不同,使用remap_tablespace。 4. **视图错误处理**:ORA-04063表示视图在导入后无效,需要重新编译或检查依赖对象。 回答结构: - 逐步解释错误原因和解决方案。 - 使用中文,因为用户要求中文回答。 - 在回答中自然地添加引用标识,例如[^1]。 - 生成相关问题,如指令要求。 最终回答应包括: 1. 引言:总结问题。 2. 分析每个错误代码。 3. 提供解决步骤。 4. 生成相关问题。 生成相关问题: - 如指令要求,在回答末尾添加相关问题。 相关问题示例: 1. 如何避免Oracle导入时的目录路径错误? 2. 什么是remap_schema和remap_tablespace在impdp中的用途? 3. 如何处理导入后的视图编译错误? 确保LaTeX语法正确:用户提到行内数学表达式用$...$,独立公式用$$...$$,但在这个问题中,可能不需要数学公式,除非涉及计算。所以,我可以避免使用数学公式,除非必要。 现在,构建回答。</think>### Oracle导入错误解决方案:ORA-39002, ORA-31694, ORA-02354, ORA-04063 您在Oracle数据库导入过程中遇到的错误涉及多个方面:主表加载失败(ORA-31694)、数据导出导入错误(ORA-02354)、视图报错(ORA-04063),以及通用操作无效错误(ORA-39002)。这些错误通常源于目录权限、文件问题、用户/表空间不匹配或对象依赖性问题。下面我将逐步分析原因并提供解决方案,帮助您逐步解决。解决方案基于Oracle官方文档和常见实践,确保可靠性和可操作性。 #### 错误分析及解决步骤 1. **ORA-39002: 操作无效** - **原因**:这是一个通用错误,通常由其他具体错误(如文件访问失败或参数错误)引发。例如,引用[1]中提到,目录路径大小写不匹配或文件夹不存在会导致此错误。在Windows系统中,路径大小写可能被忽略,但Oracle严格区分大小写[^1]。 - **解决方案**: - 检查导出/导入使用的目录路径:确保操作系统文件夹存在,且与`CREATE DIRECTORY`语句中的路径完全匹配(包括大小写)。例如,如果目录定义为`'c:\temp'`,则操作系统文件夹必须为`temp`(小写),而非`Temp`[^1]。 - 验证目录权限:运行以下SQL命令,确保Oracle用户有读写权限: ```sql SELECT * FROM dba_directories WHERE directory_name = 'YOUR_DIRECTORY_NAME'; GRANT READ, WRITE ON DIRECTORY YOUR_DIRECTORY_NAME TO PUBLIC; -- 或指定用户 ``` - 如果目录不存在,先创建操作系统文件夹,再在Oracle中定义目录。引用[1]表明,Oracle不会自动创建文件夹,必须先手动创建[^1]。 2. **ORA-31694: 主表加载/卸载失败** - **原因**:主表(master table)是impdp/expdp操作的核心元数据表。此错误通常由dump文件问题引起,如文件损坏、路径错误或文件大小不兼容(例如,文件大小不是逻辑块大小的倍数)。引用[2]指出,ORA-31694常伴随ORA-19505(文件识别失败)或ORA-27046(文件大小问题)[^2]。 - **解决方案**: - 检查dump文件完整性:使用操作系统命令验证文件大小和权限。例如,在Windows中: ```cmd dir c:\your_path\your_dumpfile.dmp ``` 确保文件大小正常(非0字节),且未被其他进程锁定。 - 重新生成dump文件:如果文件损坏,从源数据库重新导出。使用expdp命令时,添加`LOGFILE`参数捕获日志: ```sql expdp user/password@db DIRECTORY=your_dir DUMPFILE=your_dump.dmp LOGFILE=export.log ``` - 调整文件大小:如果文件大小不兼容,导出时指定`FILESIZE`参数,例如: ```sql expdp ... FILESIZE=1G -- 限制单个文件大小 ``` 导入时使用相同参数[^2]。 3. **ORA-02354: 数据导出/导入错误** - **原因**:此错误表示数据行处理失败,可能由于数据不一致、字符集不匹配或表结构冲突。常与ORA-39002一起出现。 - **解决方案**: - 检查源和目标数据库的字符集:运行以下SQL确保一致: ```sql SELECT * FROM nls_database_parameters WHERE parameter LIKE '%CHARACTERSET%'; ``` 如果不一致,导出时添加`CHARACTERSET`参数,或导入前调整目标数据库设置。 - 使用`REMAP_SCHEMA`和`REMAP_TABLESPACE`:如果导出用户和导入用户不同(或表空间不同),必须映射。引用[3]说明,例如: ```sql impdp user/password@db DIRECTORY=your_dir DUMPFILE=your_dump.dmp REMAP_SCHEMA=source_user:target_user REMAP_TABLESPACE=source_tablespace:target_tablespace ``` 这解决了方案不匹配问题[^3]。 - 启用详细日志:导入时添加`LOGFILE`和`PARALLEL`参数捕获更多细节: ```sql impdp ... LOGFILE=import.log PARALLEL=2 ``` 检查日志中的具体错误行。 4. **ORA-04063: 视图有错误** - **原因**:导入后视图编译失败,通常由于依赖对象(如表或函数)缺失或无效。此错误在导入完成后发生,与主表加载无关。 - **解决方案**: - 重新编译无效对象:导入后运行以下SQL: ```sql EXEC DBMS_UTILITY.compile_schema(schema => 'YOUR_SCHEMA'); ``` 或手动编译: ```sql ALTER VIEW your_view_name COMPILE; ``` - 检查依赖关系:使用`DBA_DEPENDENCIES`视图找出缺失对象: ```sql SELECT * FROM dba_dependencies WHERE name = 'YOUR_VIEW_NAME'; ``` 确保所有依赖表、函数等已正确导入。 - 导入时排除无效对象:如果视图错误不影响核心数据,导入时添加`EXCLUDE`参数: ```sql impdp ... EXCLUDE=VIEW ``` 之后手动创建视图。 #### 通用预防措施 - **测试环境验证**:先在测试环境模拟导入,避免生产环境风险。 - **完整命令示例**:结合以上步骤,一个健壮的impdp命令可能如下: ```sql impdp system/password@orcl DIRECTORY=dbbak DUMPFILE=data.dmp REMAP_SCHEMA=old_user:new_user REMAP_TABLESPACE=old_ts:new_ts LOGFILE=import.log PARALLEL=4 ``` - **监控与日志**:始终指定`LOGFILE`参数,并检查日志文件(如`import.log`)定位具体错误。 如果以上步骤无法解决,请提供更多细节(如操作系统版本、Oracle版本、完整错误日志),以便进一步分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值