欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Oracle “ORA-00001:违反唯一约束条件”和“ORA-00054: 资源正忙”错误解决

程序员文章站 2023-11-23 14:52:34
oracle对于常见的错误都会有报错提示,工作的这一年也碰到了一些错误,踩过一些坑,感谢那些前辈分享的问题和处理方案,正好这几天临近过年不太忙碌,就将一些错误描述,错误原因和解决方法整理后分享给大家...

oracle对于常见的错误都会有报错提示,工作的这一年也碰到了一些错误,踩过一些坑,感谢那些前辈分享的问题和处理方案,正好这几天临近过年不太忙碌,就将一些错误描述,错误原因和解决方法整理后分享给大家,大都来源于其他博客和网站,绝大部分经过测试有效。如有疑问和指正,感谢提及。

ora-00001:违反唯一约束条件:

错误描述:大都是在向一个表中插入数据时报错。

错误原因:插入的数据中涉及到有唯一约束,即不能重复数据的字段。

解决方法:单独字段的主键都是不能重复的,更改插入数据

ora-00054: 资源正忙:

错误描述:ora-00054: 资源正忙, 但指定以 nowait 方式获取资源, 或者超时失效 。

错误原因:执行dml语句操作不当造成数据库对所要操作的表上锁,此时oracle已经对返回的结果集上加了排它的行级锁,所有其他对这些数据进行的修改或删除操作都必须等待这个锁的释放,产生的外在现象就是其他的操作将发生阻塞,同样这个查询的事务将会对该表加表级锁,不允许对该表的任何ddl操作,否则将会报出ora-00054错误

解决方法:执行如下语句

select l.session_id,o.owner,o.object_name

from v$locked_object l,dba_objects o

where l.object_id=o.object_id;

select t2.username,t2.sid,t2.serial#,t2.logon_time

from v$locked_object t1,v$session t2

where t1.session_id=t2.sid order by t2.logon_time;

--得到上锁的sid和serial#

--结束该会话

alter system kill session 'sid,serial#';

注意替换sid,serial#成对应的号码

ora-00922: 选项缺失或无效:

问题描述:ora-00922: 选项缺失或无效?

错误原因:一般是语句的语法有问题。比如命名不对,关键字写错等等。对于非标准的命名,一般采用双引号来创建。

解决办法:

标识符命名规则:

1、必须以字母开始。

2、长度不能超过30个单字节字符。

3、只能包括a-z,a-z,0-9,_,$和#。

4、不能在相同用户下建立两个同名的对象。

5、不能使用保留字和关键字

ora-01034:oracle not available:

问题描述:ora-01034常与ora-27101同时出现,都是在登录数据库的时候报该错误

错误原因:出现ora-01034和ora-27101的原因是多方面的:主要是oracle当前的服务不可用,shared memory realm does not exist,是因为oracle没有启动或者没有正常启动,共享内存并没有分配给当前实例。所以,通过设置实例名,再用操作身份验证的方式,启动数据库。这样数据库就正常启动了。还有就是可能登录数据库后,不正常的退出,比如直接关掉窗口,而这时数据库里有未完成的动作,再次登录时就会提示“insufficient privilege”的报错,sql>shutdown immediate; sql>startup;就恢复正常了。最后如果是环境,看下数据库的配置文件是否对应了512m内存,还是你设置大了但本身给的不足。

解决方法:

1:先看oracle的监听和oracle的服务是否都启动了。启动oracle监听:cmd命令行窗口下,输入lsnrctl start,回车即启动监听。

2:查看oracle的sid叫什么,比如创建数据库的时候,实例名叫“orcl”,那么先手工设置一下oracle的sid,cmd命令窗口中,set oracle_sid=orcl

3:再输入sqlplus /nolog;回车

再输入conn/ as sysdba;回车

4:再输入startup,回车。这步是启动oracle服务。如果startup启动被告知已经启动了,可以先输入shutdown immediate;等shutdown结束之后,再输入startup。

5:过几秒钟等命令运行完成,就能连接了。这个时候,可以输入“select * from user_tables;”测试一下,看是否有查询结果。