oracle 错误整理


ora-01789  查询块具有不正确的结果列数
      这个错误一般在执行表之间的相加(union),相减(minus)等SQL语句时发生。只要将两段SQL语句的列数调整一致就可以解决了。
===========================================================
OCI-22053overflow error
     NET开发中使用微软的System.Data.OracleClients访问ORACLE 数据库时, 如果某字段的精度超出.NET的数据精度,就会发生OCI-22053错误.我个人解决OCI-22053错误溢出的方法是使用Oracle的函数TRUNC其具体的语法格式如下         TRUNC(number[,decimals])将length设置为NET允许的长度就OK 了
==============================================================
无法加载DLL(OCI.DLL)
     这个问题出现一般是在新装的Oracle数据库,具体原因不太清楚。解决办法也十分奇怪:首先确认oci.dll是否已经安装到了机器上,如果没有就需要拷贝一个或者重新安装。oci.dll 的默认路径应该是 X:\oracle\ora90\BIN 。然后打开他所在的文件夹的属性->安全,将你访问Oracle的帐户的全部权限取消,然后确定。接着再打开安全把全部权限再选上,最后确定。如果你没有安全选项卡那我就无能为力了。如果你不知道是哪个帐户,那每个帐户都做一次。如果你的权限复选框为不可改,那可以勾选拒绝也一样。Good luck!
========================================================
ORA-01555: Snapshot too old     这个错误很少见,跟系统设置有关系。实际的问题是对数据库执行操作时,系统的回滚段太小。引起的原因一般是执行SQL语句时间太长,执行过程中有回滚记录的操作太多。解决方法要么是增大数据库回滚段空间,要么更改SQL。
======================================================
ORA-24338: 未执行语句句柄     这个问题主要出现在使用数据库游标的时候.当执行存储过程,返回的游标没有打开时,可能会报这个错.open outCursor for select * from tempTab;     游标没有打开的情况一般是忘记了写打开游标的语句,也可能是存储过程中执行出错,导致最后游标未打开
资料来源:学网(www.xue5.com),原文地址:http://www.xue5.com/itedu/200707/140392.html
===================================================
Tomcat不失为一个好的开发学习容器,但使用Oracle 11g自带的JDBC驱动ojdbc6.jar和JDK6一起运行的时候,特别是和spring框架一起使用会报错:SEVERE: Error while registering Oracle JDBC Diagnosability MBean.
这是Oracle Database 11g Release 1 (11.1.0.6.0) JDBC Drivers 的一个Bug。更新到11.1.0.7.0版本的驱动,则现象消失。
新版JDBC驱动下载地址http://www.oracle.com/technology/global/cn/software/tech/java/sqlj_jdbc/htdocs/jdbc_111060.html


=========================================================
启动oracle数据库报错:cannot mount database in exclusive mode
SQL> conn /as sysdbaConnected to an idle instance.SQL> startupORACLE instance started.
Total System Global Area 276824064 bytesFixed Size 778736 bytesVariable Size 137371152 bytesDatabase Buffers 138412032 bytesRedo Buffers 262144 bytesORA-01102: cannot mount database in EXCLUSIVE modeSQL> shutdown immediateORA-01507: database not mountedORACLE instance shut down.GOOGLE一下,发现是lk<SID>文件造成的,该文件位于ORALCE_HOME下的dbs目录下,马上检查该文件:[root@qa-oracle dbs]# fuser -u lkNDMSQAlkNDMSQA: 6666(oracle) 6668(oracle) 6670(oracle) 6672(oracle) 6674(oracle) 6676(oracle) 6678(oracle) 6680(oracle) 6690(oracle) 6692(oracle) 6694(oracle) 6696(oracle) 6737(oracle) 6830(oracle)果然该文件没释放,用fuser命令kill掉:[root@qa-oracle dbs]# fuser -k lkNDMSQAlkNDMSQA: 6666 6668 6670 6672 6674 6676 6678 6680 6690 6692 6694 6696 6737 6830[root@qa-oracle dbs]# fuser -u lkNDMSQA然后:SQL> startupORACLE instance started.Total System Global Area 276824064 bytesFixed Size 778736 bytesVariable Size 137371152 bytesDatabase Buffers 138412032 bytesRedo Buffers 262144 bytesDatabase mounted.Database opened.SQL>数据库成功OPEN.某系统突然掉电,系统启动后发现Oracle无法启动。启动时报如下错误:
ORA-01102 cannot mount database in EXCLUSIVE mode出现1102错误可能有以下几种可能:一、在HA系统中,已经有其他节点启动了实例,将双机共享的资源(如磁盘阵列上的裸设备)占用了;二、说明Oracle被异常关闭时,有资源没有被释放,一般有以下几种可能,1、 Oracle的共享内存段或信号量没有被释放;2、 Oracle的后台进程(如SMON、PMON、DBWn等)没有被关闭;3、 用于锁内存的文件lk<sid>和sgadef<sid>.dbf文件没有被删除。首先,虽然我们的系统是HA系统,但是备节点的实例始终处在关闭状态,这点通过在备节点上查数据库状态可以证实。其次、是因系统掉电引起数据库宕机的,系统在接电后被重启,因此我们排除了第二种可能种的1、2点。最可疑的就是第3点了。查$ORACLE_HOME/dbs目录:$ cd $ORACLE_HOME/dbs$ ls sgadef*sgadef* not found$ ls lk*lkORA92果然,lk<sid>文件没有被删除。将它删除掉$ rm lk*再启动数据库,成功。如果怀疑是共享内存没有被释放,可以用以下命令查看:$ipcs -mopIPC status from /dev/kmem as of Thu Jul 6 14:41:43 2006T ID KEY MODE OWNER GROUP NATTCH CPID LPIDShared Memory:m 0 0×411c29d6 �Crw-rw-rw- root root 0 899 899m 1 0×4e0c0002 �Crw-rw-rw- root root 2 899 901m 2 0×4120007a �Crw-rw-rw- root root 2 899 901m 458755 0×0c6629c9 �Crw-r―�C root sys 2 9113 17065m 4 0×06347849 �Crw-rw-rw- root root 1 1661 9150m 65541 0xffffffff �Crw-r�Cr�C root root 0 1659 1659m 524294 0×5e100011 �Crw――- root root 1 1811 1811m 851975 0×5fe48aa4 �Crw-r―�C oracle oinstall 66 2017 25076然后它ID号清除共享内存段:$ipcrm �Cm 851975对于信号量,可以用以下命令查看:$ ipcs -sopIPC status from /dev/kmem as of Thu Jul 6 14:44:16 2006T ID KEY MODE OWNER GROUPSemaphores:s 0 0×4f1c0139 �Cra――- root root… …s 14 0×6c200ad8 �Cra-ra-ra- root roots 15 0×6d200ad8 �Cra-ra-ra- root roots 16 0×6f200ad8 �Cra-ra-ra- root roots 17 0xffffffff �Cra-r�Cr�C root roots 18 0×410c05c7 �Cra-ra-ra- root roots 19 0×00446f6e �Cra-r�Cr�C root roots 20 0×00446f6d �Cra-r�Cr�C root roots 21 0×00000001 �Cra-ra-ra- root roots 45078 0×67e72b58 �Cra-r―�C oracle oinstall根据信号量ID,用以下命令清除信号量:$ipcrm -s 45078如果是Oracle进程没有关闭,用以下命令查出存在的oracle进程:$ ps -ef|grep oraoracle 29976 1 0 Jun 22 ? 0:52 ora_dbw0_ora92oracle 29978 1 0 Jun 22 ? 0:51 ora_dbw1_ora92oracle 5128 1 0 Jul 5 ? 0:00 oracleora92 (LOCAL=NO)… …然后用kill -9命令杀掉进程$kill -9 <PID>总结:当发生1102错误时,可以按照以下流程检查、排错:1.如果是HA系统,检查其他节点是否已经启动实例;2.检查Oracle进程是否存在,如果存在则杀掉进程;3.检查信号量是否存在,如果存在,则清除信号量;4.检查共享内存段是否存在,如果存在,则清除共享内存段;5.检查锁内存文件lk<sid>和sgadef<sid>.dbf是否存在,如果存在,则删除。
============================================================
---------------------------ORACLE报错:ora-12899-----------------------------------------
IMP-00019: 由于 ORACLE 错误 12899 而拒绝行 IMP-00003: 遇到 ORACLE 错误 12899 ORA-12899: 列 "JACKEYJ"."JK_REGISTER"."OPNAME" 的值太大 (实际值: 21, 最大值: 20)
列 1 523 从9i环境下exp出来的数据,imp到10g数据库的时候就出现这个错误。
解决方法:
修改oracle 10g的字符集 Oracle 修改数据库字符集为:ZHS16GBK 查看服务器端字符集SQL > select * from V$NLS_PARAMETERS 修改:$sqlplus /nolog SQL>conn / as sysdba 若此时数据库服务器已启动,则先执行 SHUTDOWN IMMEDIATE 命令关闭数据库服务器, 然后执行以下命令: SQL>shutdown immediate SQL>STARTUP MOUNT SQL>ALTER SYSTEM ENABLE RESTRICTED SESSION SQL>ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0 SQL>ALTER SYSTEM SET AQ_TM_PROCESSES=0 SQL>ALTER DATABASE OPEN SQL>ALTER DATABASE CHARACTER SET ZHS16GBK ERROR at line 1RA-12721: operation cannot execute when other sessions are active 若出现上面的错误,使用下面的办法进行修改,使用INTERNAL_USE可以跳过超集的检查: SQL>ALTER DATABASE CHARACTER SET INTERNAL_USE ZHS16GBK SQL>SHUTDOWN IMMEDIATE SQL>STARTUP
本文来自: (www.91linux.com) 详细出处参考:http://www.91linux.com/html/article/database/oracle/20090330/16295.html
=========================================================
oracle服务丢失的解决办法程序开发 2009-12-05 16:29:07 阅读726 评论1 字号:大中
          今天加班,发现数据库服务器上的所有oracle服务都丢失了――也就是说在服务管理器中没有oracle服务了,如OracleOraDb10g_home1TNSListener、OracleServiceORCL等服务都不见了。          解决办法:          1、从另外一台安装有oracle数据库的机器上(要求oracle的版本一致)的注册表中导出所有的oracle服务。依次打开注册表目录HEY_LOCAL_MACHINE --> SYSTEM --> ControlSet001 --> Services,导出(在注册表项上右键选择“导出”)所有oracle的项:OracleDBConsoleorcl、 OracleJobSchedulerORCL、OracleOraDb10g_home1iSQL*Plus、 OracleOraDb10g_home1TNSListener、 OracleServiceORCL,保存为*.reg文件。          2、把上一步中导出的注册表文件,导入服务器上。把文件拷贝到数据库服务器上逐个双击即可。          3、修改导出的所有的注册表项,主要修改数据库实例(SID)名和数据库安装路径。          4、重启数据库服务器。          5、启动oracle的Net Manager工具,删除监听程序LISTENER和服务命名中的本机的服务,并重建监听程序和服务命名。          6、启动oracle服务即可。
=======================================================
解决ORA-12560: TNS: 协议适配器错误,与大家共享
今天遭遇ORA-12560: TNS: 协议适配器错误的问题,经过一番努力问题已经解决,与大家共享。造成ORA-12560: TNS: 协议适配器错误的问题的原因有三个:1.监听服务没有起起来。windows平台个一如下操作:开始---程序---管理工具---服务,打开服务面板,启动oraclehome92TNSlistener服务。2.database instance没有起起来。windows平台如下操作:开始---程序---管理工具---服务,打开服务面板,启动oracleserviceXXXX,XXXX就是你的database SID.3.注册表问题。regedit,然后进入HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0将该环境变量ORACLE_SID设置为XXXX,XXXX就是你的database SID.或者右几我的电脑,属性--高级--环境变量---系统变量--新建,变量名=oracle_sid,变量值=XXXX,XXXX就是你的database SID.或者进入sqlplus前,在command line下输set oracle_sid=XXXX,XXXX就是你的database SID.经过以上步骤,就可以解决问题。

你可能感兴趣的:(oracle 错误整理)