Oracle 锁等待时间过长处理(ORA-04021)
1. 问题说明
ORA-04021 通常表示:在等待锁定对象时发生超时。
常见原因:
- 存在会话长时间持有对象锁
- 会话处于挂起状态,未及时释放锁
- DDL 与 DML 互相等待
2. 快速处理流程
- 先确认是否存在锁对象
- 查到锁会话对应的 SQL 与会话信息
- 优先评估业务影响,再 kill session
- 如会话已标记 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 与锁等待监控,减少人工介入