impdp 遇到ORA-31685

本文介绍了如何处理impdp导入过程中因缺乏创建物化视图权限引发的ORA-31685错误,包括授权用户、删除导入数据并重新导入的步骤。关键在于确保用户拥有必要的操作权限。

impdp时报错:

Processing object type SCHEMA_EXPORT/MATERIALIZED_VIEW
ORA-31685: Object type  failed due to insufficient privileges. Failing sql is:
ORA-31685: Object type  failed due to insufficient privileges. Failing sql is:
ORA-31685: Object type  failed due to insufficient privileges. Failing sql is:
Job "SYS"."SYS_IMPORT_FULL_01" completed with 9 error(s) at 14:37:45

原因是导出的对象中有物化视图,但是用户没有创建物化视图的权限

对用户进行授权后,删除已导入的数据,重复导入,解决该问题

grant create materialized view to user2;

<think>我们正在解决用户关于impdp导入数据时遇到ORA-39112错误的问题。根据引用[3]中的描述,错误信息如下: ORA-39112: Dependent object type COMMENT skipped, base object type TABLE:"SJGL_RD"."ZD_DJDCB" creation failed 这个错误通常是因为在创建基表(TABLE)失败时,导致依赖于该表的对象(如COMMENT)被跳过。因此,我们需要关注为什么基表创建失败。 根据引用[3]的上下文,基表创建失败的具体原因没有直接给出,但我们可以结合其他引用和常见原因进行分析。 常见原因及解决方法: 1. **表空间问题**:可能是目标表空间不存在或空间不足,或者用户没有权限。检查`REMAP_TABLESPACE`映射是否正确,目标表空间是否存在,用户是否有足够的权限(如UNLIMITED TABLESPACE)和配额。 - 解决方法:确保目标表空间存在,并且用户有足够的权限和配额。可以使用以下SQL检查表空间: ```sql SELECT tablespace_name FROM dba_tablespaces; ``` 如果不存在,则创建表空间。 2. **表已存在**:如果导入模式中已经存在同名的表,且使用了`TABLE_EXISTS_ACTION`参数,则可能根据设置处理(跳过、替换、截断等)。如果没有设置该参数,默认会报错(ORA-39125)。 - 解决方法:可以设置`TABLE_EXISTS_ACTION`参数,例如`TABLE_EXISTS_ACTION=REPLACE`或`SKIP`或`TRUNCATE`。但需注意替换或截断会删除原有数据。如果不想覆盖,可以先将原有表重命名或删除。 引用[5]提到了ORA-39125错误(对象已存在)的解决,可以借鉴。 3. **字符集问题**:引用[4]中提到了字符集不一致导致的问题(ORA-12899)。虽然ORA-39112不是直接由字符集引起,但基表创建失败可能是由于字段长度不够(例如,源数据库是单字节字符集,目标数据库是多字节字符集,导致实际数据超长)。 - 解决方法:检查源数据库和目标数据库的字符集是否一致。如果不一致,需要调整字段长度或转换字符集。查询字符集: ```sql SELECT value FROM nls_database_parameters WHERE parameter='NLS_CHARACTERSET'; ``` 如果目标库字符集导致字段长度不够,可以修改表结构增加字段长度,或者使用`REMAP_DATA`参数转换数据。 4. **其他表结构问题**:例如约束冲突、数据类型不支持等。 - 解决方法:查看日志文件(本例中为addms_imp.log)中具体的错误信息,确定基表创建失败的原因。根据具体错误进行修正。 5. **权限问题**:用户可能没有创建表的权限。 - 解决方法:授予用户足够的权限,例如: ```sql GRANT CREATE TABLE TO user_name; ``` 操作步骤: 1. **检查日志文件**:首先查看impdp的日志文件(本例中为addms_imp.log),找到创建表"ZD_DJDCB"失败的具体原因。 2. **确认表空间映射**:检查`REMAP_TABLESPACE`参数是否正确,目标表空间(如dms_data)是否存在,且用户有权限。 3. **检查对象是否存在**:查询目标模式中是否已经存在表"ZD_DJDCB": ```sql SELECT owner, table_name FROM dba_tables WHERE table_name = 'ZD_DJDCB' AND owner = 'SJGL_RD'; ``` 如果存在,考虑使用`TABLE_EXISTS_ACTION`参数。 4. **检查字符集**:确认源数据库和目标数据库的字符集是否一致。如果不一致,考虑调整字段长度或进行字符集转换。 5. **重新导入**:根据具体原因解决后,重新运行impdp命令。 示例命令(加入TABLE_EXISTS_ACTION): ```bash impdp system/password@orcl DIRECTORY=imp_dir DUMPFILE=addms.dmp LOGFILE=addms_imp.log \ CONTENT=METADATA_ONLY SCHEMAS=addms \ REMAP_SCHEMA=addms:pcadms \ REMAP_TABLESPACE=mis_data:dms_data \ TABLE_EXISTS_ACTION=REPLACE ``` 注意:如果基表创建失败是由于数据问题(如数据超长),那么即使使用`CONTENT=METADATA_ONLY`也可能失败,因为元数据中包含了表结构定义。因此,需要确保表结构定义在目标库中有效。 如果问题仍然存在,可以尝试只导入元数据(使用`CONTENT=METADATA_ONLY`)来单独解决表结构问题,然后再导入数据(使用`CONTENT=DATA_ONLY`)。 另外,引用[2]中提到,有时导出方式可能导致问题,但本例错误与导出方式关系不大,主要在于导入环境。 总结解决步骤: 1. 查看详细日志,定位基表创建失败的具体原因。 2. 根据日志中的具体错误代码(如ORA-00959、ORA-01536等)采取相应措施。 3. 确保目标环境满足要求(表空间、权限、字符集等)。 4. 使用适当的`TABLE_EXISTS_ACTION`参数处理已存在对象。 如果用户没有提供日志的详细信息,建议用户检查日志并反馈具体错误。 [^1]: 示例引用1 [^2]: 示例引用2 [^3]: 引用[3]中提到的ORA-39112错误 [^4]: 引用[4]中关于字符集问题的说明 [^5]: 引用[5]中关于对象已存在的解决方法</think>### 解决 impdp 导入时 ORA-39112 错误的方法 ORA-39112 错误表示在创建基础对象失败时,其依赖对象(如注释、索引等)被跳过。根据引用[3]的案例,该错误通常由以下原因引起: ```log ORA-39112: Dependent object type COMMENT skipped, base object type TABLE:"SJGL_RD"."ZD_DJDCB" creation failed ``` #### 解决方法步骤: 1. **定位基础对象创建失败的根本原因** ```sql -- 检查目标表空间是否存在且可用 SELECT tablespace_name, status, contents FROM dba_tablespaces WHERE tablespace_name = 'DMS_DATA'; -- 替换为实际目标表空间名 ``` 2. **常见原因及解决方案** - **表空间问题**(引用[1]): - 确保 `REMAP_TABLESPACE` 指定的目标表空间存在 - 创建缺失的表空间: ```sql CREATE TABLESPACE dms_data DATAFILE '/path/to/dms_data.dbf' SIZE 1G AUTOEXTEND ON; ``` - **权限问题**: - 授予用户表空间配额: ```sql ALTER USER pcadms QUOTA UNLIMITED ON dms_data; ``` - **对象已存在**(引用[5]): - 添加 `TABLE_EXISTS_ACTION` 参数: ```bash impdp system/password \ DIRECTORY=imp_dir \ DUMPFILE=addms.dmp \ REMAP_SCHEMA=addms:pcadms \ REMAP_TABLESPACE=mis_data:dms_data \ TABLE_EXISTS_ACTION=REPLACE # 替换/追加/跳过 ``` - **字符集问题**(引用[4]): - 检查并统一字符集: ```sql -- 源库和目标库执行 SELECT * FROM nls_database_parameters WHERE parameter IN ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET'); ``` - 若字符集不一致,需调整字段长度或转换数据 3. **分阶段导入验证** ```bash # 先仅导入元数据验证结构 impdp system/password \ DIRECTORY=imp_dir \ DUMPFILE=addms.dmp \ CONTENT=METADATA_ONLY \ SQLFILE=ddl.sql # 生成DDL脚本检查 # 确认无误后再导入数据 impdp system/password \ DIRECTORY=imp_dir \ DUMPFILE=addms.dmp \ CONTENT=DATA_ONLY ``` 4. **处理特定对象错误** ```bash # 跳过报错的表单独处理 impdp system/password \ EXCLUDE=TABLE:\"IN \(\'ZD_DJDCB\'\)\" \ ...其他参数... ``` #### 完整解决方案示例: ```bash impdp system/password@orcl \ DIRECTORY=imp_dir \ DUMPFILE=addms.dmp \ LOGFILE=addms_imp.log \ SCHEMAS=addms \ REMAP_SCHEMA=addms:pcadms \ REMAP_TABLESPACE=mis_data:dms_data \ TABLE_EXISTS_ACTION=REPLACE \ TRANSFORM=DISABLE_ARCHIVE_LOGGING:Y \ PARALLEL=4 ``` > **关键点**:ORA-39112 是**结果性错误**,必须通过日志定位前置错误(如 ORA-00959 表空间不存在)。建议使用 `LOGIME=30` 参数保留详细日志[^3]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值