RDS for Oracle,在使用Truncate来删表中数据的时候,出现了如下的错误:
ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired。
主要原因是因为有事务正在执行(或者事务已经被锁),所有导致执行不成功。
如果是普通的Oracle数据库的话,先查看是那个session,然哈把它kill掉就可以了。
1,查看session
SELECT
X.SID
, X.SERIAL#
, TO_CHAR(
X.SQL_EXEC_START
, 'YYYY/MM/DD HH24:MI:SS'
) AS SQL_EXEC_START
, Y.SQL_TEXT
FROM
V$SESSION X
INNER JOIN V$SQL Y
ON Y.HASH_VALUE = X.SQL_HASH_VALUE
AND Y.ADDRESS = X.SQL_ADDRESS
WHERE
X.STATUS = 'ACTIVE'
AND X.SID IN (
SELECT
Z.SID
FROM
V$LOCK Z
WHERE
Z.TYPE IN ('TM','TX')
)
;
2,删除该Session
alter system kill session '352,50411';
但是如果是RDS的话,是用不了这个alter system的,因为RDS是架构在AWS虚拟机上,而它不允许咱们碰那个虚机,
这时候需要用它提供的存储过程来删。
exec rdsadmin.rdsadmin_util.kill(352, 50411);