ORA-00054:resource busy and acquire with NOWAIT specified or timeout expired(锁表解决方法)

一、故障描述:

  在数据库中插入、更新、删除一个表的数据,或者增加一个表的主键时或者表的索引时,或者是增加修改列字段时时,报错: ORA-00054:resource busy and acquire with NOWAIT specified or timeout expired,如下图。按照字面意思,是资源忙,被占用了。处理思路:查到谁在占用资源,并且杀掉占用该资源的会话就可以了。有可能产生的原因有:1.创建索引时会产生的锁  2.dml 语句会产生的锁  3.索引创建时加上关键字 online时产生的锁。解决处理方法:1.等待其他会话释放资源 2.找出占用资源的会话,并删除 3.重启数据库,当然只有第2种比较适用。

pl-sql中报错如图:

ORA-00054:resource busy and acquire with NOWAIT specified or timeout expired(锁表解决方法)

解决方法如下:
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 ORG_NAME VARCHAR2(50)

上一篇:如何从转储文件确定 /LARGEADDRESSAWARE


下一篇:Cpu飚高show-busy-java-threads一件脚本排查与Arthas线上诊断工具排查实战