--************************
-- ORA-00054 故障 处 理一 例
--************************
最近 index job 出 现 失 败 ,于是 尝试 手 动执 行 试试 。收到了 ORA- 00054 的 错误 消息。
一、 错误 消息
SQL > ALTER INDEX ESMDBA.ESM_PRCS_ERR_IDX1 rebuild ;
ALTER INDEX ESMDBA.ESM_PRCS_ERR_IDX1 rebuild
*
ERROR at line 1 :
ORA - 00054 : resource busy and acquire with NOWAIT specified
二、 查 看 当 前 数 据 库 中 当 前 锁 定 对 象
SQL > col OBJECT_NAME for a30
SQL > col username format a20
SQL > set linesize 200
SELECT object_name, s.username, s.sid, s.serial#, p.spid, to_char(s.logon_time, 'yyyy-mm-dd hh24:mi:ss' ) logon_time
FROM v$locked_object l, dba_objects o, v$session s, v$process p
WHERE l.object_id = o.object_id
AND l.session_id = sSQL> 2 3 .sid
AND s.paddr = p.addr; 4 5
OBJECT_NAME USERNAME SID SERIAL# SPID LOGON_TIME
------------------------------ -------------------- ---------- ---------- ------------ -------------------
PLAN_TABLE A505995 622 15849 26577 2011 - 06 - 08 03 : 04 : 30
ESM_PRCS_ERR SMEVFP 396 60589 8388 2011 - 06 - 11 18 : 24 : 51
VNDR_FEED_SCHED SMEVFP 467 15860 3119 2011 - 06 - 11 22 : 30 : 48
BB_RF_VNDR_FEED_RCRD SMEVFP 467 15860 3119 2011 - 06 - 11 22 : 30 : 48
BB_RF_VNDR_REPSTRY SMEVFP 773 1079 8440 2011 - 06 - 11 18 : 24 : 55
BB_RF_VNDR_FEED_RCRD_DATA SMEVFP 467 15860 3119 2011 - 06 - 11 22 : 30 : 48
BB_RF_VNDR_FEED_RCRD_DATA SMEVFP 467 15860 3119 2011 - 06 - 11 22 : 30 : 48
7 rows selected.
三、 查 看表 对 象上信息
SQL > select OWNER,INDEX_NAME,TABLE_NAME,INDEX_TYPE from dba_indexes where INDEX_NAME like '%ESM_PRCS_ERR_IDX1%' ;
OWNER INDEX_NAME TABLE_NAME INDEX_TYPE
------------------------------ ------------------------------ ------------------------------ ---------------------
ESMDBA ESM_PRCS_ERR_IDX1 ESM_PRCS_ERR NORMAL
SQL > SELECT sql_text
2 FROM v$session, v$sqltext_with_newlines
3 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;
4 5 6 Enter value for sid : 396
old 5 : AND v$session.sid = & sid
new 5 : AND v$session.sid = 396
SQL_TEXT
----------------------------------------------------------------
SELECT ERR_OID, MQ_MSGE FROM ESM_PRCS_ERR WHERE ERR_OID = : 1 FOR
UPDATE NOWAIT
四、 进 一步 尝试
事 实 上此 时 做任何表 结构 的操作 与 分析都 将会 收到 ORA- 00054 错误
SQL > analyze table ESMDBA.ESM_PRCS_ERR validate structure ;
analyze table ESMDBA.ESM_PRCS_ERR validate structure
*
ERROR at line 1 :
ORA - 00054 : resource busy and acquire with NOWAIT specified
SQL > analyze index ESMDBA.ESM_PRCS_ERR_IDX1 validate structure ;
analyze index ESMDBA.ESM_PRCS_ERR_IDX1 validate structure
*
ERROR at line 1 :
ORA - 00054 : resource busy and acquire with NOWAIT specified
五、 杀 掉 锁 定的 会话
SQL > alter system kill session '396,60589' ;
System altered.
SQL > alter session set current_schema =ESMDBA;
Session altered.
SQL > show parameter db_name
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_name string O01GRS3
SQL > ALTER INDEX ESMDBA.ESM_PRCS_ERR_IDX1 rebuild ;
Index altered.
六、原因
1 .select for update
select for update 是用于 数 据 并发 控制的 语 句。 执 行 该语 句后, 会 在表上加持 RX 锁 ( Row Exclusive , 10 gR1 之前是 Row Share 锁 ) ,
在被 选 中 记录 上加行 锁 。但是,正是因 为 其加 锁 的操作, for update 子句 会导 致 select 查询 的性能下降。
2 . 关 于 select for update 与 select for update nowait
当 使用 select for update 的 时 候,其他 会话 上 与 之相 关 的 DML,DDL 都 会 被挂起,直到 会话 select for update 的 锁 定被解除。
当 使用 select for update nowait 的 时 ,其他 会话 上 与 之相 关 的 DML,DDL 都 会 被挂起不再是挂起,是直接返回一 个资 源忙的 错误 。
3 . 结论
无 论 是使用 select ... f or update 还 是使用 select ... f or update nowait 。都 会对 相 关 的行集 进 行 锁 定,其他 会话进 行相 关
行集的 写 操作都 会 被挂起,直到 该锁 定被解除。 所以,在使用了 select ... f or update 或者 select ... f or update nowait 后,要
尽 快解除 锁 定,避免其他 会话 挂起太久, 从 而 导 致系 统 性能下降 。
七、 快捷参考
有 关 性能 优 化 请参 考
共享池的 调 整 与优 化 (Shared pool Tuning)
Oracle 表 缓 存 (caching table) 的使用
有 关 ORACLE 体系 结构请参 考
Oracle 联 机重做日志文件 (ONLINE LOG FILE)
Oracle 回 滚 (ROLLBACK) 和撤 销 (UNDO)
Oracle 实 例和 Oracle 数 据 库 (Oracle 体系 结构 )
有 关闪 回特性 请参 考
Oracle 闪 回特性 (FLASHBACK DATABASE)
Oracle 闪 回特性 (FLASHBACK DROP & RECYCLEBIN)
Oracle 闪 回特性 (Flashback Query 、Flashback Table)
Oracle 闪 回特性 (Flashback Version 、Flashback Transaction)
有 关 基于用 户 管理的 备份 和 备份 恢 复 的 概 念 请参 考
Oracle 基于用 户 管理恢 复 的 处 理 ( 详细 描述了介 质 恢 复 及其 处 理 )
有 关 RMAN 的 备份 恢 复与 管理 请参 考
RMAN 备份 路 径 困惑 ( 使用plus archivelog 时 )
有 关 ORACLE 故障 请参 考
又一例SPFILE 设 置 错误导 致 数 据 库 无法 启动
对参数 FAST_START_MTTR_TARGET = 0 的 误 解及 设 定
SPFILE 错误导 致 数 据 库 无法 启动 (ORA-01565)
有 关 ASM 请参 考
有 关 SQL/PLSQL 请参 考
SQL 基 础 --> 集合 运 算 (UNION 与 UNION ALL)
SQL 基 础 --> 层 次化 查询 (START BY ... CONNECT BY PRIOR)
SQL 基 础 --> ROLLUP 与 CUBE 运 算符 实现数 据 汇总
PL/SQL --> 异 常 处 理 (Exception)
有 关 ORACLE 其 它 特性
使用OEM,SQL*Plus,iSQL*Plus 管理Oracle 实 例
日志 记录 模式 (LOGGING 、FORCE LOGGING 、NOLOGGING)
使用外部表管理Oracle 告警日志(ALAERT_$SID.LOG)
簇表及簇表管理(Index clustered tables)
system sys ,sysoper sysdba 的 区别
ORACLE_SID 、DB_NAME 、INSTANCE_NAME 、DB_DOMIAN 、GLOBAL_NAME
Oracle 补 丁全集 (Oracle 9i 10g 11g Path)
Oracle 10.2.0.1 升 级 到 10.2.0.4