admin 发表于 2023-12-27 10:44:18

ora-00054

"ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired" Issues 问题诊断执行下面的步骤:
1) 检查是否已经产生了 ORA-00054 错误的 trace 文件和 alert log 记录
1a) 检查发生 ORA-00054 错误时间段的 alert log [ ]
1b) 查找 ORA-00054 错误信息的 trace 文件 [ ]
2) 如果没有产生 trace file/alert log 记录,则收集 errorstack [ ]
3) 执行”srdc_lock_holders.sql”脚本来查找潜在的 blockers [ ]
4) 如果不能确认 blocker,就触发 ORA-00054 错误的 systemstate [ ]
5) 整理并上传诊断信息 [ ]


1) 略

2) 如果没有找到 trace file/alert log 记录,则收集 errorstack
如果没有产生 ORA-00054 错误的 alert log 记录以及相关的 trace 文件,则在 system 级别设置 ORA-00054 errorstack 的
EVENT 并等待错误重现。从 SQL*PLUS 执行:
ALTER SYSTEM SET EVENTS '54 trace name errorstack level 3';
如果您可以在特定的 session 重现错误,则可以从 session 中产生 trace。从 SQL*PLUS 执行:
ALTER SESSION SET max_dump_file_size=unlimited;
ALTER SESSION SET EVENTS '54 trace name errorstack level 3';
ALTER SESSION SET tracefile_identifier='ORA54';
----->>>> 运行引发 ORA-00054 的 sql 语句
oradebug setmypid
oradebug tracefile_name
这样就会产生一个 trace 文件,并会以类似如下方式在 alert log 中显示:
Errors in file /dbadmin/diag/rdbms/v12102/trace/v12102_ora_3353.trc:
ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired

3) 执行”srdc_lock_holders.sql”脚本来查找潜在的 blockers

4) 如果不能确认 blocker,就触发 ORA-00054 错误的 systemstate
如果您不能确认持有阻塞锁的 blocker 进程,可以使用下面的命令触发 ORA-00054 错误的 systemstate dump:
ALTER SYSTEM SET events '54 trace name systemstate level 258';
设置完之后,重现 ORA-00054 错误。
如果您可以在特定的 session 重现错误,则可以从 session 中产生 trace。从 SQL*PLUS 执行:
ALTER SESSION SET max_dump_file_size=unlimited;
ALTER SESSION SET EVENTS '54 trace name systemstate level 258';
ALTER SESSION SET tracefile_identifier='ORA54';
----->>>> 运行引发 ORA-00054 错误的 sql 语句
oradebug setmypid
oradebug tracefile_name
这样就会产生一个与 session 相关的 trace 文件,并会以类似如下方式在 alert log 中显示:
System State dumped to trace file /dbadmin/diag/rdbms/v12102/trace/v12102_ora_3353.trc

注意:
该命令将会产生包含任何发生 ORA-00054 错误时的 systemstate 信息。Systemstate 命令会为系统上的每个进
程 dump trace 输出,所以这会产生一个很大的 trace 文件。
当收集完 systemstate 之后,可以使用下面的命令来禁止将来从 ORA-00054 错误中再产生 systemstate 的 trace。
ALTER SYSTEM SET events '54 trace name context off';


admin 发表于 2023-12-27 10:45:06

REM srdc_lock_lolders.sql - collect Lock holder information
define SRDCNAME='Lock_Holders'
SET MARKUP HTML ON PREFORMAT ON
set TERMOUT off FEEDBACK off VERIFY off TRIMSPOOL on HEADING off
COLUMN SRDCSPOOLNAME NOPRINT NEW_VALUE SRDCSPOOLNAME
select 'SRDC_'||upper('&&SRDCNAME')||'_'||upper(instance_name)||'_'||
   to_char(sysdate,'YYYYMMDD_HH24MISS') SRDCSPOOLNAME from v$instance;
set TERMOUT on MARKUP html preformat on
REM
spool &&SRDCSPOOLNAME..htm
select '+----------------------------------------------------+' from dual
union all
select '| Diagnostic-Name: '||'&&SRDCNAME' from dual
union all
select '| Timestamp:       '||
   to_char(systimestamp,'YYYY-MM-DD HH24:MI:SS TZH:TZM') from dual
union all
select '| Machine:         '||host_name from v$instance
union all
select '| Version:         '||version from v$instance
union all
select '| DBName:          '||name from v$database
union all
select '| Instance:      '||instance_name from v$instance
union all
select '+----------------------------------------------------+' from dual
/

set linesize 132 pagesize 66 heading on
break on Kill on username on terminal
column Kill heading 'Kill String' format a13
column res heading 'Resource Type' format 999
column id1 format 9999990
column id2 format 9999990
column lmode heading 'Lock Held' format a20
column request heading 'Lock Requested' format a20
column serial# format 99999
column usernameformat a10heading "Username"
column terminal heading Term format a7
column tab format a35 heading "Table Name"
column owner format a9
column Address format a18
column ctime heading "Held for (s)"
select      nvl(S.USERNAME,'Internal') username,
      nvl(S.TERMINAL,'None') terminal,
      L.SID||','||S.SERIAL# Kill,
      U1.NAME||'.'||substr(T1.NAME,1,20) tab,
      decode(L.LMODE,1,'No Lock',
                2,'Row Share',
                3,'Row Exclusive',
                4,'Share',
                5,'Share Row Exclusive',
                6,'Exclusive',null) lmode,
      decode(L.REQUEST,1,'No Lock',
                2,'Row Share',
                3,'Row Exclusive',
                4,'Share',
                5,'Share Row Exclusive',
                6,'Exclusive',null) request,
      l.ctime
from      V$LOCK L,
      V$SESSION S,
      SYS.USER$ U1,
      SYS.OBJ$ T1
where      L.SID = S.SID
and      T1.OBJ# = decode(L.ID2,0,L.ID1,L.ID2)
and      U1.USER# = T1.OWNER#
and      S.TYPE != 'BACKGROUND'
order by 1,2,5
/

spool off
set markup html off preformat off

admin 发表于 2023-12-27 14:35:07


Username   Term    Kill String       Table Name                             Lock Held                  Lock Requested       Held for (s)
---------- ------- ------------- ----------------------------------- -------------------- -------------------- ------------
SYS           pts/3   30,31615       SYS.ORA$BASE                             Share                                                  4
ZHYU           pts/1   275,10962       SYS.I_METASCRIPTFILTER2$             Exclusive                                                451
                               ZHYU.T                              Row Exclusive                                        451
                               SYS.ORA$BASE                             Share                                                475
页: [1]
查看完整版本: ora-00054