Oracle常见错误及解决方法.docx
《Oracle常见错误及解决方法.docx》由会员分享,可在线阅读,更多相关《Oracle常见错误及解决方法.docx(12页珍藏版)》请在冰豆网上搜索。
Oracle常见错误及解决方法
Oracle常见错误及解决方法
来源:
考试大 【分享考试大•共建考试大】 2007年10月17日
1、ORA-12541:
TNS:
没有监听器 原因:
没有启动监听器或者监听器损坏。
如果是前者,使用命令net start OracleOraHome81TNSListener(名字可能有出入)即可;如果是后者,则使用“Net8 Configuration Assistant”工具向导之“监听程序配置”增加一个监听器即可(基本不用写任何信息,一路OK。
在添加之前可能需要把所有的监听器先删除!
)
2、ORA-12500:
TNS:
监听程序无法启动专用服务器进程 或
ORA-12560:
TNS:
协议适配器错误 原因:
ORACLE的数据库服务没有启动。
使用命令net start ORACLESERVICEORADB(ORADB为数据库名字)即可。
如果仍没有解决,请继续向下看。
3、如果数据库服务启动失败,则很有可能是其注册表项值损坏,最好的做法是以下两步:
1)ORADIM -DELETE -SID oradb 删除数据库服务项
2)ORADIM -NEW -SID oradb 新增数据库服务项 注:
这个过程中如果出错,就重启计算机!
4、ORA-12154:
TNS:
能解析服务名 原因:
ORACLE的网络服务名没有正确配置。
请使用“Net8 Configuration Assistant”工具向导之“本地网络服务名配置”配置TNS即可。
如果仍没有解决,请继续向下看。
5、ORA-1034 :
TNS:
ORACLE不可用 原因:
ORACLE的数据库服务正确启动,但是数据库没有打开!
使用命令:
1)svrmgrl 启动服务管理器
2)connect internal 以internal身份登陆
3)startup 打开数据库
6、ORA-12560:
TNS:
协议适配器错误(顽固性的) 原因:
未知。
解决:
必杀技--打开“Windows任务管理器”,杀死ORACLE.exe及ORADIM.exe进程,书写自己的ora_startup.bat,执行之!
PS:
1、我的ora_startup.bat:
net start OracleOraHome81TNSListener
net start ORACLESERVICEORADB
svrmgrl 一般情况下不用,不过有时少不了它的,具体步骤见第5步。
2、我的ora_shutdown.bat:
net stop OracleOraHome81TNSListener
net stop ORACLESERVICEORADB
3、ORACLE相关服务名请参见“管理工具”之“服务”中以ORACLE开头的服务名。
以下是删除服务项的一些办法做参考,从中不难发现你看不到相关服务项的原因。
方法一:
1. 运行regedit
2. 选择HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServices
3. 选中需要删除的SERVICE,将其删除 重新启动后就可以了 该文章转载自[编程助理站]:
方法二:
1、开始->设置->控制面板->管理工具->服务停止所有Oracle服务。
2、开始->程序->Oracle - OraHome81->Oracle Installation Products->Universal Installer 卸装所有Oracle产品,但Universal Installer本身不能被删除
3、运行regedit,选择HKEY_LOCAL_MACHINESOFTWAREORACLE,按del键删除这个入口。
4、运行regedit,选择HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServices,滚动这个列表,删除所有Oracle入口。
5、运行regedit,
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesEventlogApplication, 删除所有Oracle入口。
6、开始->设置->控制面板->系统->高级->环境变量 删除环境变量CLASSPATH和PATH中有关Oracle的设定
7、从桌面上、STARTUP(启动)组、程序菜单中,删除所有有关Oracle的组和图标
8、删除Program FilesOracle目录
9、重新启动计算机,重起后才能完全删除Oracle所在目录
10、删除与Oracle有关的文件,选择Oracle所在的缺省目录C:
Oracle,删除这个入 口目录及所有子目录,并从Windows 2000目录(一般为C:
WINNT)下删除以下文 件ORACLE.INI、oradim73.INI、oradim80.INI、oraodbc.ini等等。
11、 WIN.INI文件中若有[ORACLE]的标记段,删除该段
12、 如有必要,删除所有Oracle相关的ODBC的DSN
13、 到事件查看器中,删除Oracle相关的日志
说明:
到现在为止,你还是可以发现在服务里面还有oracle的服务存在,必须把他删除,否则你再安装oracle时就会出现什么服务已经存在的错误提示了!
!
而这些服务是在HKEY_LOCAL_MACHINESYSTEMCurrentControlSetEnumRoot下以LEGACY_ORACLE打头的,而且你选种按delete删除时系统会提示你一个错误!
!
不让你删除!
!
!
现提供具体删除方法,win2000的如下:
运行regedt32注意了,不是regedit!
!
!
!
在HKEY_LOCAL_MACHINE那页找到HKEY_LOCAL_MACHINESYSTEMCurrentControlSetEnumRoot先选中ROOT然后点菜单上的安全-权限把自己添加到里面,并且权限设置为完全控制,确定后再删除ROOT下所有LEGACY_ORACLE打头的键,同样的方法也可以把HKEY_LOCAL_MACHINESYSTEMControlSet001和HKEY_LOCAL_MACHINESYSTEMControlSet002两个下面EnumRoot下所有LEGACY_ORACLE打头的键删除,重新启动计算机可以发现,服务里面的那些都没有了!
!
在winXP中就比较简单了,还是运行regedit,找到LEGACY_ORACLE打头的键后右击,选择权限,同样将everyone设置为完全控制就可以删除了!
删除后重新启动一下就可以了!
!
如果有个别DLL文件无法删除的情况,则不用理会,重新启动,开始新的安装,安装时,选择一个新的目录,则,安装完毕并重新启动后,老的目录及文件就可以删除掉了。
产生原因:
上述ORACLE错误为回滚段表空间不足引起的,这也是ORACLE数据管理员最常见的ORACLE错误信息。
当用户在做一个非常庞大的数据操作导致现有回滚段的不足,使可分配用的回滚段表空间已满,无法再进行分配,就会出现上述的错误。
解决方式:
使用“ALTERTABLESPACEtablespace_nameADDDATAFILEfilenameSIZEsize_of_file”命令向指定的数据增加表空间,根据具体的情况可以增加一个或多个表空间。
当然这与还与你主机上的裸盘设备有关,如果你主机的裸盘设备已经没有多余的使用空间,建议你不要轻意的增加回滚段表空间的大小,可使用下列的语句先查询一下剩余的tablespace空间有多少:
Selectuser_name,sql_textfromV$open_cursorwhereuser_name=’’;
如果多余的空间比较多,就可以适当追加一个大的回滚段给表空间使用,从而避免上述的错误。
你也可以用以下语句来检测一下rollbacksegment的竞争状况:
Selectclass,countfromV$waitstatwherecalssin(‘systemundoheader’,’systemundoblock’,’undoheader’,’undoblock’);
和
Selectsum(value)fromV$sysstatwherenamein(‘db_block_gets’,’consistentsgets’);
如果任何一个classincount/sum(value)大于1%,就应该考虑增加rollbacksegment。
ORA-01652:
unabletoextendtempsegmentbynumintablespacename
产生原因:
ORACLE临时段表空间不足,因为ORACLE总是尽量分配连续空间,一但没有足够的可分配空间或者分配不连续就会出现上述的现象。
解决方法:
我们知道由于ORACLE将表空间作为逻辑结构-单元,而表空间的物理结构是数据文件,数据文件在磁盘上物理地创建,表空间的所有对象也存在于磁盘上,为了给表空间增加空间,就必须增加数据文件。
先查看一下指定表空间的可用空间,使用视图SYS.DBA_FREE_SPACE,视图中每条记录代表可用空间的碎片大小:
SQL>Selectfile_id,block_id,blocks,bytesfromsys.dba_free_spacewheretablespace_name=’’;
返回的信息可初步确定可用空间的最大块,看一下它是否小于错误信息中提到的尺寸,再查看一下缺省的表空间参数:
SQL>SELECTINITIAL_EXTENT,NEXT_EXTENT,MIN_EXTENTS,PCT_INCREASEFROMSYS.DBA_TABLESPACESWHERE
TABLESPACE_NAME=name;
通过下面的SQL命令修改临时段表空间的缺省存储值:
SQL>ALTERTABLESPACEnameDEFAULTSTORAGE(INITIALXXXNEXTYYY);
适当增大缺省值的大小有可能解决出现的错误问题,也可以通过修改用户的临时表空间大小来解决这个问题:
SQL>ALTERUSERusernameTEMPORARYTABLESPACEnew_tablespace_name;
使用ALTERTABLESPACE命令,一但完成,所增加的空间就可使用,无需退出数据库或使表空间脱机,但要注意,一旦添加了数据文件,就不能再删除它,若要删除,就要删除表空间。
一个报错例子如下:
ORA-1652:
unabletoextendtempsegmentby207381intablespaceTEMPSPACE
ORA-01578:
Oracledatablockcorrupted(file#num,block#num)
产生原因:
当ORACLE访问一个数据块时,由于:
1、硬件的I/O错误;
2、操作系统的I/O错误或缓冲问题;
3、内存或paging问题;
4、ORACLE试图访问一个未被格式化的系统块失败;5、数据文件部分溢出等上述几种情况的一种引起了逻辑坏块或者物理坏块,这时就会报ORA-01578的错误。
解决方式:
由于ORACLE只有在访问到有问题的数据文件时才会报错,所以报错的时间有可能会比实际出错的时间要晚,如果ORA-01578出错信息提示数据坏块指向的是用户自己的数据文件,则用以下方法来解决:
如果通过下面的SQL语句查出的坏块出现有索引上,则只需重建索引即可
SQL>Selectowner,segment_name,segment_typefromdba_extentswherefile_id=andbetweenblock_idandblock_id+blocks-1;(和分别是ORA-01578报出的坏块出现的文件号和块号)
如果坏块出现在表上,先用以下语句分析是否为永久性坏块(建议多执行一两次,有助于鉴别数据坏块是永久性的(硬盘上的物理坏块)还是随机性的(内存或硬件错误引起)):
SQL>Analyzetablevalidatestructurecascade;
执行该命令后,可能会出现以下的结果:
ORA-01578:
与原先错误信息有相同的参数,为永久性的物理或逻辑坏块;与原先错误信息有不同的参数,可能与内存,pagespace和I/O设备有关。
如果用户有此表的最新备份,那么最好是用此备份来恢复此表,或者使用event10231来取出坏块以外的数据:
<1>.先关闭数据库
<2>.编辑init.ora文件,加入:
event=”10231tracenamecontextforever,level10”
<3>.startuprestrict
<4>.创建一个临时表:
SQL>createtableerrortempasselect*fromerror;(error是坏表的表名)
<5>.把event从init.ora文件中删掉并重起数据库
<6>.rename坏表,把临时表rename成坏表的表名
<7>.创建表上的INDEX等
如果ORA-01578出错信息提示数据坏块指向的是数据字典或者是回滚段的话,你应该立即与ORACLE公司联系,共同商量一个好的解决办法。
这里所讲的解决方法只是比较常见的一种,一些更为具体的解决办法可以查看一下ORACLE的故障解决手册,那里面有浞及使用ROWID方法来取出坏块以外的数据的方法,这里就不介绍了。
[NextPage]
ORA-01628:
max#ofextentsnumreachedforrollbacksegmentnum
产生原因:
这种错误通常为一个回滚段和一个表空间已经达到MAXEXTENTS参数设置的极限。
要注意的是这个MAXEXTENTS不是该回滚段或表空间的硬件极限,硬件极限取决于数据库创建时在init.ora文件中指定的DB_BLOCK_SIZE参数的值。
解决方法:
使用SQL命令ALTERTABLESPACE…STORAGE(MAXEXTENTSXXXX)来增加MAXEXTENTS,其中“XXXX”值必须大于错误信息中所指的数值,但不能大于LARGESTMAXEXTENT的值,如果已经达到了LARGESTMAXEXTENTVALUE,解决的办法就是重新创建较大的范围尺寸,使用带有选项COMPRESS=Y的Export工具导出表,如果表空间有可用空间,先给表做一个备份,用altertablespacetablespace_name更改其名字,然后再装载表回数据库。
查看其错误出现的地方,如果出现在回滚段或索引上,那么必须将其删除并重建,如果出现在临时表空间,修改临时表空间的存储字段,便可解决这个问题。
一个报错例子如下:
ORA-1628:
max#extents50reachedforrollbacksegmentRBS_1
ORA-00600:
internalerrorcode,arguments:
[num],[?
],[?
],[?
],[?
]
产生原因:
这种错误通常为ORACLE的内部错误,只对OSS和ORACLE开发有用。
ORA-600的错误经常伴随跟踪文件的状态转储(系统状态和进程状态),系统状态存储将包括ORACLERDBMS持有的当前对象的信息,进程状态转储则将显示特殊进程持有的对象,当进程符合了某错误条件时,经常是由于一些信息取自它持有的一个块,如果我们知道这些错误进程持有的块,就容易跟踪问题的来源。
解决方法:
一般来说出现这个错误我们本身是无法解决的,只有从提高系统本身各方面来解决这个内部问题,如增加硬件设备,调整系统性能,使用OPS(当然OPS从某种意义上说并不是一种好的解决方式)等。
ORA-600错误的第一个变量用于标记代码中错误的位置(代码中的每个部分的第一变量都不一样),从第二个到第五个变量显示附加信息,告诉OSS代码在哪里出现了错误。
一个报错例子如下:
ORA-00600:
internalerrorcode,arguments:
[1237],[],[],[],[],[],[],[]
ORA-03113:
end-of-fileoncommunicationchannel
产生原因:
通讯不正常结束,从而导致通讯通道终止
解决方法:
1>.检查是否有服进程不正常死机,可从alert.log得知
2>.检查sql*NetDriver是否连接到ORACLE可执行程序
3>.检查服务器网络是否正常,如网络不通或不稳定等4>.检查同一个网上是否有两个同样名字的节点
5>.检查同一个网上是否有重复的IP地址
ORA-00942:
tableorviewdoesnotexist
产生原因:
这是由于装载的表或视图不存在,多半是CATEXP.SQL还没有运行,无法执行Export视图,如果CATEXP.SQL已经运行,则可能是版本错误。
解决方法:
因为Import和Export共享的一些视图是通过运行CATEXP.SQL来装载的(它们具有相同的视图),并不生成单独的CATEXP.SQL,因而造成视图与Export代码不同步,较难保持彼此之间的兼容,用户就必须建立自己的Export应用,从而避免ORA-00942的错误。
上述错误均为我们在使用回滚段时比较常见的问题,ORA-01598指明当前使用的回滚段的状态为“notonline”,不能使用,将它改为“online”状态即可使用;ORA-01636指明当前回滚段已经为“online”状态,可以直接使用,不用再集合它。
ORA-1636signalledduring:
alterrollbacksegmentrb00online
我们在做统计时还可能遇到下述问题:
一个rollbacksegment的状态为”NeedsRecovery”的现象,这是由于ORACLE回退一个事物表中的没有提交的事物时失败所造成的。
通常原因为一个datafile或者tablespace是在offline的状态或者一个undo的目标被破坏或者rollbacksegment被破坏。
解决的办法是将所有的tablespace和datafile都置为online状态,如果不能解决则做下面的工作:
1>.在initsid.ora中加入event=”10015tracenamecontextforeverlever10”;
2>.shutdown数据库然后重启;
3>.在$ORACLE_HOME/rdbms/log下,找到startup时生成的tracefile;
4>.在trace文件中,找到下列信息“errorrecoverytx(#,#)object#”;
5>.根据object#(与sys.dba_objects表中的object_id相同)在sys.dba_objects表中查出该object的名字;
6>.将该objectdrop掉;
7>.在init.ora文件中将该rollbacksegment放回rollback_segments参数中,删除event;8>.shutdown数据库然后重启。
此时”NeedsRecovery”的问题应该是完全解决了,否则就是rollbacksegment被破坏了。
ORA-01688:
unabletoextendtablename.namepartitionNAMEbyNUMintablespaceNAME
产生原因:
指定的tablespace空间已经被占用满,无法扩展。
解决方法:
使用“ALTERTABLESPACEADDDATAFILE”命令增加文件系统文件和原始分区,或者增加INITIAL的大小(如:
altertablespaceCDRS101defaultstorage(next500Mpctincrease1))应该能够解决,否则就是有人使用你的表空间上创建了一个比较大的数据文件导致你的表空间不够用。
一个报错例子如下:
ORA-1688:
unabletoextendtableRMMCDR.LOCAL_CDRpartitionLOCAL_CDR101by460800intablespaceCDRS101
资料来源:
学网(),原文地址:
Oracle最经常碰到的错误及解决
来源:
2007年07月27日08:
50 网友评论:
0条 点击:
317
没有人会否认ORACLE是全球最有影响的数据库产品之一;不过好的东西似乎总不是那么好用(初看起来如此),甚至有些无情--总会给layman们一个个无情的错误号。
下面是我个人的总结:
关于“好的东西似乎总不是那么好用(初看起来如此)”的一个笑话:
在参加IBMDB2512、513培训前,在校园网上下载到了安装程序,不过任凭我们几个同学研究个半天,也不知哪个文件是安装文件,竟没有安装成功。
最后,一致认为:
看来这个培训真是太有必要了!
事后,才知道--我们下载的是4linux的!
[以8.1.6为例]:
1、ORA-12541:
TNS:
没有监听器
原因:
没有启动监听器或者监听器损坏。
如果是前者,使用命令netstartOracleOraHome81TNSListener(名字可能有出入)即可;如果是后者,则使用“Net8ConfigurationAssistant”工具向导之“监听程序配置”增加一个监听器即可(基本不用写任何信息,一路OK。
在添加之前可能需要把所有的监听器先删除!
)
2、ORA-12500:
TNS:
监听程序无法启动专用服务器进程
或ORA-12560:
TNS:
协议适配器错误
原因:
ORACLE的数据库服务没有启动。
使用命令netstartORACLESERVICEORADB(ORADB为数据库名字)即可。
如果仍没有解决,请继续向下看。
3、数据库服务启动失败
很有可能是其注册表项值损坏,最好的做法是以下两步:
ORADIM-DELETE-SIDoradb删除数据库服务项
ORADIM-NEW-SIDoradb新增数据库服务项
注:
这个过程中如果出错,就重启计算机!
4、ORA-12154:
TNS:
能解析服务名
原因:
ORACLE的网络服务名没有正确配置。
请使用“Net8ConfigurationAssistant”工具向导