ORA-38001 to ORA-39970
ORA-39083: 对象类型 (对象类型名) 创建失败, 出现错误:\n(错误描述)\n(失败的sql为):\n(SQL语句)
ORA-39083: Object type string failed to create with error:\nstring\nFailing sql is:\nstring
原因1: 检查原始错误代码以确定实际原因。
Examine original error code to determine actual cause
- 状态: 已验证。
分析: 此项异常只是一个桥梁,需关注“出现错误”后的实际对应错误编码和执行失败的SQL语句,如下例所示,为在执行impdp导入数据时产生的异常:
-- 此时出现的ORA-39083不需要关注,只需分析后边的ORA-14048及失败的SQL语句 …… …… ORA-39083: 对象类型 CONSTRAINT 创建失败, 出现错误: ORA-14048: 分区维护操作不能与其他操作组合 失败的 sql 为: ALTER INDEX "C##LY"."SYS_C00136360" UNUSABLE ENABLE …… ……
措施: 原始错误代码将包含更多信息(分析原始错误代码,具体情况具体对待)。
Original error code will contain more information
ORA-39151: 表 ("String"."String"=>["SCHEMA名"."表名"])已存在。由于TABLE_EXISTS_ACTION参数值设置为SKIP, 将跳过所有相关元数据和数据
ORA-39151: Table "String"."String" exists. All dependent metadata and data will be skipped due to table_exists_action of skip
原因1: 相关表已存在。
- 状态: 已验证,疑未记录在ORACLE异常文档中。
分析: 不一定是错误,某种程度上是一个ORACLE的提示警告信息,在利用ORACLE的impdp命令导入表的时候可能遇到,是因为出现dump文件中的需要导入的表已经在数据库用户schema下存在了,而你在使用impdp命令时未指定TABLE_EXISTS_ACTION的参数值,ORACLE虽然默认将值设置为了SKIP,但它发现有冲突的表仍然提示告诉你此处需要根据实际情况自主选择参数值,如下例所示:
-- 创建测试表 create table ora_39151(a number); -- windows系统cmd命令窗口执行导出ora_39151的dump文件 expdp C##LY/密码@XE tables=ora_39151 dumpfile=ora_39151.dmp directory=data_pump_dir logfile=expdp_ora_39151.log -- 测试导入 impdp C##LY/密码@XE tables=ora_39151 dumpfile=ora_39151.dmp directory=data_pump_dir logfile=impdp_ora_39151.log -- 得到异常,impdp_ora_39151.log信息如下所示 ;;; Import: Release 11.2.0.2.0 - Production on 星期四 8月 31 20:33:27 2017 Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved. ;;; 连接到: Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production 已成功加载/卸载了主表 "C##LY"."SYS_IMPORT_TABLE_01" 启动 "C##LY"."SYS_IMPORT_TABLE_01": C##LY/********@XE tables=ora_39151 dumpfile=ora_39151.dmp directory=data_pump_dir logfile=impdp_ora_39151.log; 处理对象类型 TABLE_EXPORT/TABLE/TABLE ORA-39151: 表 "C##LY"."ORA_39151" 已存在。由于跳过了 table_exists_action, 将跳过所有相关元数据和数据。 处理对象类型 TABLE_EXPORT/TABLE/TABLE_DATA 作业 "C##LY"."SYS_IMPORT_TABLE_01" 已经完成, 但是有 1 个错误 (于 20:33:31 完成)
措施: 分析实际情况,判断是否需要导入dump文件中对应冲突表的元数据及数据信息。
如果确定不导入此类冲突表的数据,则不用进行任何操作,可忽视上面的错误,当然加上TABLE_EXISTS_ACTION=skip,亦可不出现错误,但任然会有提示信息:
-- 设置skip值重新测试导入 impdp C##LY/密码@XE tables=ora_39151 dumpfile=ora_39151.dmp directory=data_pump_dir logfile=impdp_ora_39151.log -- 未得到异常,impdp_ora_39151.log信息如下所示 ;;; Import: Release 11.2.0.2.0 - Production on 星期四 8月 31 20:40:44 2017 Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved. ;;; 连接到: Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production 已成功加载/卸载了主表 "C##LY"."SYS_IMPORT_TABLE_01" 启动 "C##LY"."SYS_IMPORT_TABLE_01": C##LY/********@XE tables=ora_39151 dumpfile=ora_39151.dmp directory=data_pump_dir logfile=impdp_ora_39151.log table_exists_action=skip 处理对象类型 TABLE_EXPORT/TABLE/TABLE 表 "C##LY"."ORA_39151" 已存在。由于跳过了 table_exists_action, 将跳过所有相关元数据和数据。 处理对象类型 TABLE_EXPORT/TABLE/TABLE_DATA 作业 "C##LY"."SYS_IMPORT_TABLE_01" 已于 20:40:46 成功完成
如果确定要导入此类冲突表的数据甚至元数据,则需重新执行导入操作,根据备注的描述选择其它参数进行处理。
备注: TABLE_EXISTS_ACTION参数值:
- SKIP: 表示跳过此表继续处理下个对象。
- APPEND: 表示在现有表数据行后追加dump文件中数据。
- TRUNCATE: 表示删除现有表中数据,然后导入dump文件中数据。
- REPLACE: 表示删除现有的表,然后从dump文件创建该表并导入数据。