导入数据IMP-00058 ORA-00904

本文介绍在将Oracle源库分区表数据迁移到历史库时遇到IMP-00058 ORA-00904错误的解决过程。通过对比源库和目标库表结构差异,添加缺失字段后成功完成数据迁移。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

将源库分区表数据迁移到历史库中碰到IMP-00058 ORA-00904错误,具体操作及解决如下:

$imp 
\'/ as sysdba\' STATISTICS=NONEDATA_ONLY=y  file=/backup/wxlun20130911.dmplog=/backup/wxlun20130911.implog fromuser=wxlun touser=wxlun_his  buffer=5400000

Import: Release 11.2.0.3.0 - Production on Wed Sep 11 10:54:392013

Copyright (c) 1982, 2011, Oracle and/or itsaffiliates.  All rights reserved.


Connected to: Oracle Database 11g Enterprise Edition Release11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real ApplicationTesting options

Export file created by EXPORT:V11.02.00 via conventional path

Warning: the objects were exported by WXLUN, not by you

import done in ZHS16GBK character set and AL16UTF16 NCHAR characterset
. importing WXLUN's objects into WXLUN_HIS
. . importing partition "WXLUN_T01":"PT_201306"
IMP-00058: ORACLE error 904 encountered
ORA-00904: "TOEXPRESSCOMPANYID": invalid identifier
IMP-00057: Warning: Dump file may not contain data of allpartitions of this table

. . importing partition "WXLUN_T02":"VAPT_201306"  12553338 rows imported
IMP-00057: Warning: Dump file may not containdata of all partitions of this table ---因为只导入一个分区数据,会报这个错误,在此忽略
Import terminated successfully with warnings.

表WXLUN_T02分区数据导入成功,而WXLUN_T01导入失败,查看目的库的WXLUN_T01表结构
SYS@wxlun_his>desc WXLUN.WXLUN_T01
 Name                                     Null?   Type
 ------------------------------------------------- ----------------------------
 BCID                                     NOT NULL VARCHAR2(20)
 FORMCODE                                 NOT NULL VARCHAR2(50)
 CURRENTSTATUS                            NOT NULL NUMBER(3)
 PRESTATUS                                NOT NULL NUMBER(3)
 RETURNSTATUS                                      NUMBER(3)
 OPERATETYPE                              NOT NULL NUMBER(5)
 CURRENTDISTRIBUTIONCODE                  NOT NULL VARCHAR2(50)
 DELIVERSTATIONID                         NOT NULL NUMBER(10)
 NOTE                                     NOT NULL VARCHAR2(400)
 CREATEBY                                 NOT NULL NUMBER(10)
 CREATEDEPT                               NOT NULL NUMBER(10)
 CREATETIME                               NOT NULL DATE
 ISDELETED                                NOT NULL NUMBER(1)
 SYNCFLAG                                 NOT NULL NUMBER(1)
 SYNCTIME                                          DATE
 IPADDRESS                                         VARCHAR2(20)
 CLIENTINFO                                        VARCHAR2(2000)


源库WXLUN_T01表结构
sys@wxlun:SQL>desc WXLUN.WXLUN_T01
 Name                                                                    Null?   Type
 -------------------------------------------------------------------------------- -------------------------------------------------
 BCID                                                                    NOT NULL VARCHAR2(20)
 FORMCODE                                                                NOT NULL VARCHAR2(50)
 CURRENTSTATUS                                                           NOT NULL NUMBER(3)
 PRESTATUS                                                               NOT NULL NUMBER(3)
 RETURNSTATUS                                                                     NUMBER(3)
 OPERATETYPE                                                             NOT NULL NUMBER(5)
 CURRENTDISTRIBUTIONCODE                                                 NOT NULL VARCHAR2(50)
 DELIVERSTATIONID                                                        NOT NULL NUMBER(10)
 NOTE                                                                    NOT NULL VARCHAR2(400)
 CREATEBY                                                                NOT NULL NUMBER(10)
 CREATEDEPT                                                              NOT NULL NUMBER(10)
 CREATETIME                                                              NOT NULL DATE
 ISDELETED                                                               NOT NULL NUMBER(1)
 SYNCFLAG                                                                NOT NULL NUMBER(1)
 SYNCTIME                                                                         DATE
 IPADDRESS                                                                        VARCHAR2(20)
 CLIENTINFO                                                                       VARCHAR2(2000)
 TODISTRIBUTIONCODE                                                               VARCHAR2(100)
 TOEXPRESSCOMPANYID                                                               NUMBER


发现源库的表增加了两个字段(随着业务需要,某些表会增加字段),将目的库表添加相应字段,并将导入失败的表数据重新导入:

SYS@wxlun_his>alter table WXLUN.WXLUN_T01 add TODISTRIBUTIONCODEVARCHAR2(100);
alter table WXLUN.WXLUN_T01 add TOEXPRESSCOMPANYID NUMBER;

Table altered.

SYS@wxlun_his>
Table altered.

$imp  \'/ as sysdba\' STATISTICS=NONEDATA_ONLY=y  file=/backup/wxlun20130911.dmplog=/backup/wxlun20130911.implog fromuser=wxlun touser=wxlun_his buffer=5400000 tables=WXLUN_T01

Import: Release 11.2.0.3.0 - Production on Wed Sep 11 11:09:282013

Copyright (c) 1982, 2011, Oracle and/or itsaffiliates.  All rights reserved.


Connected to: Oracle Database 11g Enterprise Edition Release11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real ApplicationTesting options

Export file created by EXPORT:V11.02.00 via conventional path

Warning: the objects were exported by WXLUN, not by you

import done in ZHS16GBK character set and AL16UTF16 NCHAR characterset
. importing WXLUN's objects into WXLUN_HIS
. . importing partition"WXLUN_T01":"PT_201306"   6779635 rowsimported   ---导入成功
IMP-00057: Warning: Dump file may not contain data of allpartitions of this table
Import terminated successfully with warnings.
$
<think>好的,用户遇到了ORA-00904错误,需要解决方案。首先我要回顾一下这个错误的常见原因。ORA-00904通常表示SQL语句中使用了无效的列名或标识符。根据提供的引用,特别是用户在使用exp或impdp时遇到这个问题,可能涉及数据库对象不存在或权限问题。 首先,用户提到在导出时出现这个错误,引用[4]指出导出时执行了涉及SYS.EXU9PTS和SYS.EXU9TYPT的查询,而可能这些系统视图中的某些列在特定Oracle版本中不存在。需要检查使用的工具版本是否与数据库版本兼容,比如旧版本的exp工具连接新版本数据库可能导致问题。 其次,引用[1]中的案例是impdp报错,涉及ORIGINAL_OBJECT_NAME列无效,这可能是因为数据泵导出文件中的元数据引用了目标数据库不存在的列。需要确认导出和导入数据库版本是否一致,或者是否有补丁未应用。 另外,引用[3]提到以SYSTEM用户或DBA身份执行导出时出现错误,可能权限过高导致访问了不兼容的系统表。这时候建议使用数据泵(expdp/impdp)代替传统的exp/imp工具,因为数据泵更现代化且兼容性更好。 接下来需要分步骤解决问题。第一步是检查SQL语句中的列名是否正确,特别是用户提到的案例中可能涉及系统视图,需要确认列是否存在。第二步是检查数据库对象权限,确保用户有访问相关对象的权限。第三步是确认工具和数据库版本的兼容性,必要时升级工具或应用补丁。第四步,如果使用传统工具,考虑迁移到数据泵。第五步,收集更多错误信息,比如开启跟踪或检查日志,帮助定位具体问题。 同时,用户可能需要更新统计信息或检查无效对象,但根据引用内容,这似乎不是主要原因。最后,要提醒用户如果自行解决困难,可以联系Oracle支持,提供详细的环境信息。 现在需要将这些分析整理成结构化的回答,分步骤说明解决方案,并生成相关问题。同时确保遵循系统级指令,正确使用LaTeX格式,添加引用标识。</think>### ORA-00904错误解决方案 #### 1. 错误原因分析 ORA-00904表示SQL语句中引用了无效的标识符(如列名、表名或函数名)。根据引用内容,常见场景包括: - 使用过时的导出工具(如`exp`)连接新版本数据库[^4] - 数据泵(`impdp`)导入时目标库缺少相关列(如`ORIGINAL_OBJECT_NAME`)[^1] - 系统视图查询时权限不足或版本不兼容[^3] #### 2. 分步解决方案 **步骤1:验证SQL语法** 检查报错语句中的标识符是否存在拼写错误,例如: ```sql -- 错误示例 SELECT ORIGINAL_OBJECT_NAME FROM DBA_OBJECTS; ``` 需确认目标数据库的`DBA_OBJECTS`视图中是否存在该列: ```sql DESC DBA_OBJECTS; ``` **步骤2:检查工具与数据库版本兼容性** - 若使用传统工具`exp/imp`,建议升级为`expdp/impdp` - 确保客户端工具版本与数据库版本一致 例如:Oracle 19c数据库应使用19c版本的`expdp`工具 **步骤3:验证系统视图权限** 以SYSDBA身份执行以下操作: ```sql GRANT SELECT ON SYS.EXU9PTS TO <用户名>; GRANT SELECT ON SYS.EXU9TYPT TO <用户名>; ``` 若问题仍存在,可能需检查视图列是否存在: ```sql SELECT COLUMN_NAME FROM ALL_TAB_COLS WHERE TABLE_NAME = 'EXU9PTS' AND OWNER = 'SYS'; ``` **步骤4:应用最新补丁集** 某些情况下缺失列可能是未安装补丁导致: ```shell # 检查当前补丁版本 SELECT * FROM V$VERSION; # 通过OPatch工具升级 opatch apply ``` **步骤5:使用数据泵替代传统工具** 传统导出示例升级为数据泵: ```shell # 旧方式(可能报错) exp system/password file=export.dmp # 新方式 expdp system/password directory=DATA_PUMP_DIR dumpfile=export.dmp ``` #### 3. 高级排查方法 - **开启SQL跟踪**: ```sql ALTER SESSION SET SQL_TRACE = TRUE; ``` 通过跟踪文件定位具体报错语句 - **检查无效对象**: ```sql SELECT OBJECT_NAME, OBJECT_TYPE FROM ALL_OBJECTS WHERE STATUS = 'INVALID'; ``` #### 4. 特殊案例处理 当报错信息显示`ORA-00904: : invalid identifier`(冒号间无具体标识符)时: 1. 检查客户端字符集设置: ```sql SELECT * FROM NLS_DATABASE_PARAMETERS; ``` 2. 验证NLS_LANG环境变量: ```shell echo $NLS_LANG # 应设置为与数据库一致的字符集,如: export NLS_LANG=AMERICAN_AMERICA.AL32UTF8 ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值