重建索引的时候报ORA-00054错误,此错误在Oracle 10G Error Messages是如下描述的:
ORA-00054:resource busy and acquire with NOWAIT specified
Cause:Resource interested is busy.
Action:Retry if necessary.
此错误发生在resource被锁了,同时又发出一个NOWAIT的命令。例如在update一个表的同时对他重建索引。解决方法,等待resource的锁释放以后再试。释放的方法可以通过等待事务完成自动释放,也可以强制结束session的方法释放。具体方法根据实际需要来决定,下面是强制结束session的方法释放此resource的锁:
1.查看数据库中那些用户产生了锁
SQL> select username,sid,serial#,logon_time from v$locked_object,v$session where v$locked_object.session_id=v$session.sid;
USERNAME SID SERIAL# LOGON_TIME
------------------------------ ---------- ---------- -----------
NEWCCS 1491 11152 2010-7-6 17
2.根据SID查看具体的SQL语句
SQL> select sql_text from v$session,v$sqltext_with_newlines where decode(v$session.sql_hash_value,0,prev_hash_value,sql_hash_value)=v$sqltext_with_newlines.hash_value and v$session.sid=&sid order by piece;
3.如果短时间内此SQL语句无法完成,且急需重建索引,那么kill此session
SQL> alter system kill session '1491,11152';
二、
标签: 杂谈 |
分类: oracle学习笔记 |
当某个数据库用户在数据库中插入、更新、删除一个表的数据,或者增加一个表的主键时或者表的索引时,常常会出现ora-00054:resource busy and acquire with nowait specified这样的错误。
主要是因为有事务正在执行(或者事务已经被锁),所有导致执行不成功。
1、用dba权限的用户查看数据库都有哪些锁
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;
如:testuser 339 13545 2009-3-5 17:40:05
知道被锁的用户testuser,sid为339,serial#为13545
2、根据sid查看具体的sql语句,如果sql不重要,可以kill
select sql_text from v$session a,v$sqltext_with_newlines b
where DECODE(a.sql_hash_value, 0, prev_hash_value, sql_hash_value)=b.hash_value
and a.sid=&sid order by piece;
查出来的sql,如: begin :id := sys.dbms_transaction.local_transaction_id; end;
3、kill该事务
alter system kill session '339,13545';
4、这样就可以执行其他的事务sql语句了
如增加表的主键:
alter table test
add constraint PK_test primary key (test_NO);