跳到主要内容

Oracle 锁等待时间过长处理(ORA-04021)

1. 问题说明

ORA-04021 通常表示:在等待锁定对象时发生超时。

常见原因:

  • 存在会话长时间持有对象锁
  • 会话处于挂起状态,未及时释放锁
  • DDL 与 DML 互相等待

2. 快速处理流程

  1. 先确认是否存在锁对象
  2. 查到锁会话对应的 SQL 与会话信息
  3. 优先评估业务影响,再 kill session
  4. 如会话已标记 kill 但未退出,转 OS 层面杀进程

3. 查询锁对象

select object_name, s.sid, s.serial#
from v$locked_object l, dba_objects o, v$session s
where l.object_id = o.object_id
and l.session_id = s.sid;

4. 查询导致锁表的 SQL

select l.session_id sid,
s.serial#,
l.locked_mode,
l.oracle_username,
s.user#,
l.os_user_name,
s.machine,
s.terminal,
a.sql_text,
a.action
from v$sqlarea a, v$session s, v$locked_object l
where l.session_id = s.sid
and s.prev_sql_addr = a.address
order by sid, s.serial#;

5. 终止锁会话

alter system kill session '<sid>,<serial#>';

6. 若提示 ORA-00031(marked for kill)

6.1 查 Oracle 进程号(SPID)

select spid, osuser, s.program
from v$session s, v$process p
where s.paddr = p.addr
and s.sid = <sid>;

6.2 在操作系统层面杀进程(Linux)

kill -9 <spid>

7. 排查“无死锁但仍卡住”的活跃 SQL

SELECT s.sid,
s.serial#,
s.username,
t.sql_text
FROM v$session s,
v$sqltext_with_newlines t
WHERE t.address = s.sql_address
AND t.hash_value = s.sql_hash_value
AND s.status = 'ACTIVE';

找到异常会话后,再执行:

alter system kill session '<sid>,<serial#>';

8. 处理建议

  • 先做业务确认,再执行 kill
  • 高峰期优先选择最小影响窗口
  • 处理后检查应用连接池是否自动恢复
  • 建议补充慢 SQL 与锁等待监控,减少人工介入