数据库用户在数据库中truncate表时,常常会出现ora-00054:resource busy and acquire with nowait specified这样的错误。主要是因为有事务正在执行(或者事务已经被锁),所有导致执行不成功。

 1、用sysdba权限的用户查看数据库都有哪些锁
 SQL> select t2.username,t2.sid,t2.serial#,t2.logon_time
  2  from v$locked_object t1,v$session t2
  3  where t1.session_id=t2.sid order by t2.logon_time;

USERNAME                                                            SID
------------------------------------------------------------ ----------
   SERIAL# LOGON_TIME
---------- -------------------
ATM                                                                  19
       359 2010-05-24 10:23:56 

2。 根据sid查看具体的sql语句,如果sql不重要,可以kill

SQL> select sql_text from v$session a,v$sqltext_with_newlines b
  2    where DECODE(a.sql_hash_value, 0, prev_hash_value, sql_hash_value)=b.hash_value
  3    and a.sid=&sid order by piece;
Enter value for sid: 19
old   3:   and a.sid=&sid order by piece
new   3:   and a.sid=19 order by piece

 

SQL_TEXT
--------------------------------------------------------------------------------
insert into atm1_collectconfiglog (id,collecttype,collectdate,co
llectdataid,collectdataname,collectaction,collectcontent) values
 ((select decode(max(id)+1,'','1',max(id)+1) from atm1_collectco
nfiglog),'ATM1_Circuit',sysdate,'439612','BJ3G_s5p5_vp3c123-FJXM
1B2_s7p5_d123_CCS','update','更新:电路ID439612,更新电路名称:BJ3
G_s5p5_vp3c123-FJXM1B2_s7p5_d123_CCS,更新电路带宽:262144')

6 rows selected.

 

3、kill该事务

SQL> alter system kill session '19,359';

 

alter system kill session '19,359'
*
ERROR at line 1:
ORA-00031: session marked for kill

不行,需要这样做:

 

SQL>select 'kill -9  ' ||SPID||  from v$process where addr in (select PADDR from v$session where sid=&sid and SERIAL#=&serial);

 

后执行

SQL> truncate table atm.atm1_collectconfiglog;

 

Table truncated.